From b0d8d9ba8247da835bd8705e951b9c4be2e7fb1c Mon Sep 17 00:00:00 2001
From: Skriv <skrivelese@gmail.com>
Date: Tue, 25 May 2021 01:45:27 +0000
Subject: [PATCH] RESS forbidden masturbation to js

---
 src/events/RESS/arcadeSadist.js          |   2 +-
 src/events/RESS/forbiddenMasturbation.js | 501 +++++++++++++++++++++++
 src/events/randomEvent.js                |   1 +
 src/js/eventSelectionJS.js               |   7 -
 src/uncategorized/RESS.tw                | 281 -------------
 5 files changed, 503 insertions(+), 289 deletions(-)
 create mode 100644 src/events/RESS/forbiddenMasturbation.js

diff --git a/src/events/RESS/arcadeSadist.js b/src/events/RESS/arcadeSadist.js
index 61f9962cc1e..d7682055679 100644
--- a/src/events/RESS/arcadeSadist.js
+++ b/src/events/RESS/arcadeSadist.js
@@ -169,7 +169,7 @@ App.Events.RESSArcadeSadist = class RESSArcadeSadist extends App.Events.BaseEven
 					if (canDoVaginal(eventSlave)) {
 						r.push(`pussy,`);
 						seX(eventSlave, "vaginal", V.PC, "penetrative");
-					} else if (eventSlave.dick > 0 && eventSlave.chstityPenis === 0) {
+					} else if (eventSlave.dick > 0 && eventSlave.chastityPenis === 0) {
 						r.push(`dick,`);
 					} else {
 						r.push(`body,`);
diff --git a/src/events/RESS/forbiddenMasturbation.js b/src/events/RESS/forbiddenMasturbation.js
new file mode 100644
index 00000000000..15b78462256
--- /dev/null
+++ b/src/events/RESS/forbiddenMasturbation.js
@@ -0,0 +1,501 @@
+App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => s.rules.release.masturbation === 0,
+				s => !App.Utils.hasNonassignmentSex(s),
+				s => s.need > 0,
+				s => s.devotion <= 95,
+				s => s.trust >= -20,
+				s => (s.chastityPenis !== 1 || s.dick === 0),
+				hasAnyArms,
+				hasAnyLegs
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, His, his, him, himself
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+		const {hisA, himselfA, HisA} = getPronouns(assistant.pronouns().main).appendSuffix('A');
+		const bellyAdj = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let r = [];
+		if (V.assistant.personality > 0) {
+			r.push(`There is an alert from ${V.assistant.name}, in ${hisA} deliciously feminine voice: "${properMaster()},`, contextualIntro(V.PC, eventSlave, "DOM"), `is masturbating. Ooh, ${he}'s breaking the rules, ${properMaster()}!" ${HisA} avatar`);
+			switch (V.assistant.appearance) {
+				case "monstergirl":
+					r.push(`strokes ${hisA} dicks suggestively.`);
+					break;
+				case "shemale":
+					r.push(`shifts uncomfortably, ${hisA} cock rock hard.`);
+					break;
+				case "amazon":
+					r.push(`struts back and forth indignantly, ${hisA} bone bangles rattling.`);
+					break;
+				case "businesswoman":
+					r.push(`licks ${hisA} cherry-red lips suggestively.`);
+					break;
+				case "fairy":
+				case "pregnant fairy":
+					r.push(`giggles uncontrollably.`);
+					break;
+				case "hypergoddess":
+				case "goddess":
+					r.push(`tutting disapprovingly, despite ${hisA} blushing.`);
+					break;
+				case "loli":
+					r.push(`stares innocently at the scene.`);
+					break;
+				case "preggololi":
+					r.push(`stares at the scene, blushing, while a hand caresses ${hisA} large belly.`);
+					break;
+				case "angel":
+					r.push(`is covering ${hisA} face, occasionally peeping through _hisA fingers.`);
+					break;
+				case "cherub":
+					r.push(`is trying ${hisA} hardest to look away, but keeps glancing back at the scene.`);
+					break;
+				case "incubus":
+					r.push(`is openly jacking off to the sight.`);
+					break;
+				case "succubus":
+					r.push(`is groping ${himselfA} to the sight.`);
+					break;
+				case "imp":
+					r.push(`is hovering while viciously fingering ${hisA} cunt.`);
+					break;
+				case "witch":
+					r.push(`is pretending to read from ${hisA} spell book, but is obviously watching over the top of it.`);
+					break;
+				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
+					r.push(`is mimicking ${hisA} actions nearly perfectly.`);
+					break;
+				case "schoolgirl":
+					r.push(`giggles nervously.`);
+					break;
+				default:
+					r.push(`spins accusingly.`);
+			}
+		} else {
+			r.push(`There is a gentle alert from ${V.assistant.name}: "${properMaster()},`, contextualIntro(V.PC, eventSlave, "DOM"), `is masturbating in violation of the rules."`);
+		}
+		r.push(`A video feed appears.`);
+		if (eventSlave.chastityVagina) {
+			r.push(`In ${his} chastity belt, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"} and some furtive fingering of ${his} asshole.`);
+		} else if ((eventSlave.chastityPenis === 1)) {
+			r.push(`In ${his} chastity cage, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"} and some furtive fingering of ${his} asshole.`);
+		} else if ((eventSlave.dick > 0) && (eventSlave.hormoneBalance >= 100)) {
+			r.push(`Since ${he}'s impotent from hormone treatment, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`);
+		} else if ((eventSlave.dick > 0) && (eventSlave.balls > 0) && (eventSlave.ballType === "sterile")) {
+			r.push(`Since ${he}'s impotent due to ${his} useless balls, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`);
+		} else if ((eventSlave.dick > 0) && (eventSlave.balls === 0)) {
+			r.push(`Since ${he}'s impotent due to ${his} lack of balls, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`);
+		} else if (!canAchieveErection(eventSlave) && (eventSlave.dick > 6)) {
+			r.push(`Since ${his} dick requires far too much blood to get erect, ${he}'s furiously massaging the semi-engorged monster.`);
+		} else if (!canAchieveErection(eventSlave) && (eventSlave.dick > 0)) {
+			r.push(`Since ${he}'s can't get it up, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`);
+		} else if ((eventSlave.vagina === -1) && (eventSlave.dick === 0)) {
+			r.push(`${He}'s rubbing ${his} perineum desperately with one hand, and ${his} anus with the other, since ${he} lacks external genitalia.`);
+		} else if (eventSlave.vagina === -1) {
+			r.push(`${He}'s furiously jacking off.`);
+		} else if (eventSlave.clit >= 3) {
+			r.push(`${He}'s furiously jacking off ${his} clitdick.`);
+		} else {
+			r.push(`${He}'s furiously polishing ${his} pearl.`);
+		}
+		r.push(`${He}'s chosen to do it in a dark corner and looks like ${he}'s hurrying; ${he} clearly knows this is forbidden.`);
+		App.Events.addParagraph(node, r);
+		r = [];
+
+		r.push(`${eventSlave.slaveName} does not hear your`);
+		if (canHear(eventSlave)) {
+			r.push(`approach until you're very close.`);
+		} else {
+			r.push(`approach, but soon realizes your presence.`);
+		}
+		r.push(`${He} starts and tries to look normal.`);
+		if (!canTalk(eventSlave)) {
+			r.push(`${He} nervously gestures that ${he} wasn't doing anything.`);
+		} else {
+			r.push(Spoken(eventSlave, `"I wasn't doing anything, ${(eventSlave.rudeTitle === 1) ? PoliteRudeTitle(eventSlave) : Master}!"`), `${he} lies.`);
+		}
+
+		App.Events.addParagraph(node, r);
+		const unknownOradvanceableFetish = eventSlave.fetishKnown !== 1 || eventSlave.fetishStrength <= 95;
+		const responses = [new App.Events.Result(`Let ${him} earn relief`, relief)];
+		if (eventSlave.fetish !== "cumslut" || unknownOradvanceableFetish) {
+			responses.push(new App.Events.Result(`when ${he} sucks`, sucks));
+		}
+		if (eventSlave.fetish !== "boobs" || unknownOradvanceableFetish) {
+			responses.push(new App.Events.Result(`during nipple play`, nipple));
+		}
+		if ((eventSlave.fetish !== "pregnancy" || unknownOradvanceableFetish) && eventSlave.belly >= 5000) {
+			responses.push(new App.Events.Result(`while fondling ${his} belly`, belly));
+		}
+		if (canDoAnal(eventSlave) && eventSlave.fetish !== "buttslut" || unknownOradvanceableFetish) {
+			responses.push(new App.Events.Result(`when ${he} takes it up the ass`, ass, (eventSlave.anus === 0 ? `This option will take ${his} anal virginity` : null)));
+		}
+		if (eventSlave.fetish !== "humiliation" || unknownOradvanceableFetish) {
+			responses.push(new App.Events.Result(`in public`, inPublic));
+		}
+		if (eventSlave.fetish !== "submissive" || unknownOradvanceableFetish) {
+			responses.push(new App.Events.Result(`while submitting to a spanking`, spanking));
+		}
+		if (eventSlave.fetish !== "masochist" || unknownOradvanceableFetish) {
+			responses.push(new App.Events.Result(`while in pain`, pain));
+		}
+
+		if (responses.length > 1) {
+			responses.splice(1, 0, new App.Events.Result(null, null, `Punish ${him}, but then let ${him} get off:`));  // Hack for providing a headline to certain responses
+		}
+		App.Events.addResponses(node, responses);
+
+		function relief() {
+			r = [];
+
+			r.push(`${He}'s extremely relieved that you're not going to punish ${him} for the rulebreaking when you tell ${him} that ${he} can touch ${himself} if ${he}`);
+			if (eventSlave.belly >= 300000) {
+				r.push(`leans over ${his} ${bellyAdj} belly`);
+			} else {
+				r.push(`gets on ${his} knees`);
+			}
+			r.push(`and sucks you off. ${He} does a decent job, playing with ${himself} all the while. ${He}'s learned that ${he} can get away with infractions if ${he}'s willing to suck dick afterward. ${His} resistance to your will <span class="devotion dec">has increased.</span>`);
+			eventSlave.devotion -= 5;
+			seX(eventSlave, "oral", V.PC, "penetrative");
+			return r;
+		}
+
+		function sucks() {
+			r = [];
+			if (V.PC.belly >= 10000) {
+				if (eventSlave.belly >= 300000) {
+					r.push(`You tip ${him} over ${his} ${bellyAdj}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy,`);
+					} else {
+						r.push(`middle,`);
+					}
+					r.push(`do your best to get close beside ${him},`);
+				} else if (eventSlave.belly >= 5000) {
+					r.push(`You order ${him} to bend over beside you so your pregnancy doesn't obstruct you as badly`);
+				} else {
+					r.push(`You lean back, pull ${him} over your knee and under your gravid dome of a middle`);
+				}
+			} else {
+				if (eventSlave.belly >= 300000) {
+					r.push(`You tip ${him} over ${his} ${bellyAdj}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy`);
+					} else {
+						r.push(`middle`);
+					}
+				} else if (eventSlave.belly >= 5000) {
+					r.push(`You spread your legs to give ${his}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy`);
+					} else {
+						r.push(`bloated middle`);
+					}
+					r.push(`room as you pull ${him} onto your lap`);
+				} else {
+					r.push(`You pull ${him} down over your knee`);
+				}
+			}
+			r.push(`and spank ${his} ${eventSlave.skin} buttocks until they're warm to the touch. It's not a sexual punishment, it's too painful for that; by the end, ${eventSlave.slaveName} has cried ${himself} out and is limp in your hands. You pull ${him} up to face you and give ${him} your instructions: from now on, ${he} can come to you and ask to`);
+			if (V.PC.dick !== 0 && V.PC.vagina !== -1) {
+				r.push(`blow you and perform cunnilingus on you,`);
+			} else if (V.PC.dick !== 0) {
+				r.push(`blow you,`);
+			} else if (V.PC.vagina !== -1) {
+				r.push(`and perform cunnilingus on you,`);
+			}
+			r.push(`and masturbate while ${he} does. ${He} nods through ${his} tears and flees. In an hour or so, though, ${he} finds you and asks to`);
+			if (V.PC.vagina !== -1) {
+				r.push(`give you oral.`);
+			} else {
+				r.push(`suck your cock.`);
+			}
+			r.push(`When you pretend indifference, ${he} abjectly begs. Soon, ${he}'s down on ${his} knees, crying a little with shame as ${he} masturbates furiously.`);
+			seX(eventSlave, "oral", V.PC, "penetrative", 5);
+			if (eventSlave.fetish === "cumslut" && eventSlave.fetishKnown === 1) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of`);
+				if (V.PC.dick === 0) {
+					r.push(`giving head`);
+				} else {
+					r.push(`sucking cock`);
+				}
+				r.push(`has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetish = "cumslut";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 65;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of`);
+				if (V.PC.dick === 0) {
+					r.push(`giving head.</span>`);
+				} else {
+					r.push(`sucking cock.</span>`);
+				}
+			}
+			return r;
+		}
+
+		function nipple() {
+			r = [];
+			if (V.PC.belly >= 10000) {
+				if (eventSlave.belly >= 300000) {
+					r.push(`You tip ${him} over ${his} ${bellyAdj}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy,`);
+					} else {
+						r.push(`middle,`);
+					}
+					r.push(`do your best to get close beside ${him}, and grope ${him} thoroughly, bringing ${him} to the painful edge of orgasm. Just when ${he}'s about to tip over the edge, the stimulation stops and you flip ${him} onto ${his} back, lower your gravid body down to ${his} level and start playing with ${his} nipples.`);
+				} else if (eventSlave.belly >= 5000) {
+					r.push(`You order ${him} to bend over beside you so your pregnancy doesn't obstruct you as badly and grope ${him} thoroughly, bringing ${him} to the painful edge of orgasm. Just when ${he}'s about to tip over the edge, the stimulation stops and you haul ${him} upright and start playing with ${his} nipples.`);
+				} else {
+					r.push(`You lean back, pull ${him} over your knee and under your gravid dome of a middle and grope ${him} thoroughly, bringing ${him} to the painful edge of orgasm. Just when ${he}'s about to tip over the edge, the stimulation stops and you haul ${him} upright and start playing with ${his} nipples.`);
+				}
+			} else {
+				if (eventSlave.belly >= 300000) {
+					r.push(`You tip ${him} over ${his} ${bellyAdj}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy`);
+					} else {
+						r.push(`middle`);
+					}
+					r.push(`and grope ${him} thoroughly, bringing ${him} to the painful edge of orgasm. Just when ${he}'s about to tip over the edge, the stimulation stops and you haul ${him} up into your lap, ${his} stomach spreading your legs, and start playing with ${his} nipples.`);
+				} else if (eventSlave.belly >= 5000) {
+					r.push(`You spread your legs to give ${his}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy`);
+					} else {
+						r.push(`bloated middle`);
+					}
+					r.push(`room as you pull ${him} onto your lap and grope ${him} thoroughly, bringing ${him} to the painful edge of orgasm. Just when ${he}'s about to tip over the edge, the stimulation stops and you haul ${him} up into your lap and start playing with ${his} nipples.`);
+				} else {
+					r.push(`You pull ${him} down over your knee and grope ${him} thoroughly, bringing ${him} to the painful edge of orgasm. Just when ${he}'s about to tip over the edge, the stimulation stops and you haul ${him} up into your lap and start playing with ${his} nipples.`);
+				}
+			}
+			r.push(`${He} writhes and sobs at the orgasm denial, since the nipple play is just barely enough to keep ${him} at a high level of arousal without giving relief. You switch back and forth until ${he} finally goes over into muscle-spasming climax during nipple stimulation alone.`);
+			seX(eventSlave, "mammary", V.PC, "penetrative");
+			if ((eventSlave.fetish === "boobs") && (eventSlave.fetishKnown === 1)) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of breast play has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetish = "boobs";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 65;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at every brush against ${his} breasts.</span>`);
+			}
+			return r;
+		}
+
+		function belly() {
+			r= [];
+			r.push(`You`);
+			if (eventSlave.belly >= 300000) {
+				r.push(`roll ${him} onto ${his} back`);
+			} else {
+				r.push(`pull ${him} into a sitting position on your lap`);
+			}
+			r.push(`and grope ${his} ${bellyAdj}`);
+			if (eventSlave.bellyPreg >= 3000) {
+				r.push(`pregnancy`);
+			} else {
+				r.push(`stomach`);
+			}
+			r.push(`thoroughly, allowing ${him} to reach the painful edge of orgasm. You feel ${his} belly shudder as ${he} reaches climax under your ministrations. You tease ${his}`);
+			if (eventSlave.belly >= 10001) {
+				r.push(`popped`);
+			}
+			r.push(`navel as ${he} comes down from ${his} masturbation session.`);
+			if ((eventSlave.fetish === "pregnancy") && (eventSlave.fetishKnown === 1)) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="lightcoral">${His} enjoyment of pregnancy has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetish = "pregnancy";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 65;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at`);
+				if (eventSlave.pregKnown === 1) {
+					r.push(`every thought about ${his} pregnancy`);
+				} else {
+					r.push(`the very thought of being pregnant`);
+				}
+				r.push(`.</span>`);
+			}
+			return r;
+		}
+
+		function ass() {
+			r= [];
+			r.push(`You`);
+			if (V.PC.belly >= 10000) {
+				if (eventSlave.belly >= 300000) {
+					r.push(`tip ${him} over ${his} ${bellyAdj}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy,`);
+					} else {
+						r.push(`middle,`);
+					}
+					r.push(`do your best to get close beside ${him},`);
+				} else if (eventSlave.belly >= 5000) {
+					r.push(`order ${him} to bend over beside you so your pregnancy doesn't obstruct you as badly`);
+				} else {
+					r.push(`lean back, pull ${him} over your knee and under your gravid dome of a middle`);
+				}
+			} else {
+				if (eventSlave.belly >= 300000) {
+					r.push(`tip ${him} over ${his} ${bellyAdj}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy`);
+					} else {
+						r.push(`middle`);
+					}
+				} else if (eventSlave.belly >= 5000) {
+					r.push(`spread your legs to give ${his}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						r.push(`pregnancy`);
+					} else {
+						r.push(`bloated middle`);
+					}
+					r.push(`room as you pull ${him} onto your lap`);
+				} else {
+					r.push(`pull ${him} down over your knee`);
+				}
+			}
+			r.push(`and spank ${his} ${eventSlave.skin} buttocks until they're warm to the touch. It's not a sexual punishment, it's too painful for that; by the end, ${eventSlave.slaveName} has cried ${himself} out and is limp in your hands. You pull ${him} up to face you and give ${him} your instructions: from now on, ${he} can come to you and ask you to assrape ${him}, and masturbate while ${he} takes`);
+			if (V.PC.dick === 0) {
+				r.push(`anal penetration.`);
+			} else {
+				r.push(`cock.`);
+			}
+			r.push(`${He} nods through ${his} tears and flees. In an hour or so, though, ${he} finds you and haltingly asks you to buttfuck ${him}. When you pretend indifference, ${he} offers you ${his} anus and abjectly begs you to stick`);
+			if (V.PC.dick === 0) {
+				r.push(`a strap-on`);
+			} else {
+				r.push(`your cock`);
+			}
+			r.push(`up ${his} butt. Soon, ${he}'s down on all fours, crying a little with mixed shame and anal pain as ${he} masturbates furiously.`);
+			r.push(VCheck.Anal(eventSlave, 5));
+			if ((eventSlave.fetish === "buttslut") && (eventSlave.fetishKnown === 1)) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of anal has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetish = "buttslut";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 65;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of anal sex.</span>`);
+			}
+			return r;
+		}
+
+		function inPublic() {
+			r= [];
+			r.push(`You bring ${him} out`);
+			if (App.Entity.facilities.club.established) {
+				r.push(`to ${App.Entity.facilities.club.nameCaps}`);
+			} else {
+				r.push(`onto the street`);
+			}
+			r.push(`and secure ${him} upright with a set of vibrators attached to all of ${his} erogenous zones. There's a lot of them, and they're extremely powerful; when you test the setup, ${he} wriggles with the intensity of the stimulation, and is about to climax when you shut it down. Without telling ${him}, you slave the vibrators to a program originally designed for VIP security details. It uses the cameras scattered through the area to detect when passersby are looking at ${him}. The more eyes on ${him}, the stronger the vibrations.`);
+			if ((eventSlave.fetish === "humiliation") && (eventSlave.fetishKnown === 1)) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of humiliation has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetish = "humiliation";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 65;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s starting to long for humiliation.</span>`);
+			}
+			return r;
+		}
+
+		function spanking() {
+			r= [];
+			r.push(`You tell ${him} that ${he} can get ${himself} off while ${he}'s being spanked, and that's it: you don't tell ${him} to offer ${his} bottom, much less start spanking ${him}. ${He} doesn't understand for a long moment, but before long ${he}'s begging abjectly for a spanking, and has ${his} buttocks presented, quivering with simultaneous arousal and fear of pain. The pain comes soon enough, with a delicious crack of palm on flesh`);
+			if (eventSlave.voice === 0) {
+				r.push(`and a hoarse grunt, the most noise ${he} can make.`);
+			} else {
+				r.push(`and a shriek of agony.`);
+			}
+			r.push(`${He} masturbates furiously, but you're an accomplished spanker, and you repeatedly cause ${him} just enough pain to prevent climax. Eventually ${he} gets off in part because of, rather than in spite of, the lengthy beating.`);
+			if ((eventSlave.fetish === "submissive") && (eventSlave.fetishKnown === 1)) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of submission has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetish = "submissive";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 65;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he} starts to associate submitting to you with getting off.</span>`);
+			}
+			return r;
+		}
+
+		function pain() {
+			r = [];
+			r.push(`You order ${him} to`);
+			if ((eventSlave.heels === 1) && shoeHeelCategory(eventSlave) === 0) {
+				r.push(`kneel`);
+			} else if (shoeHeelCategory(eventSlave) > 1) {
+				r.push(`teeter`);
+			} else {
+				r.push(`stand`);
+			}
+			if (hasBothArms(eventSlave)) {
+				r.push(`with ${his} arms`);
+			} else {
+				r.push(`with ${his} arm`);
+			}
+			if (hasBothLegs(eventSlave)) {
+				r.push(`over ${his} head and ${his} legs splayed,`);
+			} else {
+				r.push(`over ${his} head and ${his} leg bent,`);
+			}
+			r.push(`and tell ${him} that if ${he} moves or resists, ${his} punishment will begin again from the start.`);
+			if ((eventSlave.chastityVagina) || (eventSlave.chastityPenis === 1)) {
+				r.push(`${He} was touching ${his} nipples and ass, so you flick and torture ${his} nipples and give ${him} a severe spanking.`);
+			} else if (!canAchieveErection(eventSlave) && (eventSlave.dick > 6)) {
+				r.push(`${He} was playing with ${his} oversized cock, so you kick and swat at the swollen monster, enjoying the way it spasms.`);
+			} else if ((eventSlave.dick > 0) && !canAchieveErection(eventSlave)) {
+				r.push(`${He} was touching ${his} limp dick and ass, so you slap and torture ${his} offending dick and give ${him} a severe spanking.`);
+			} else if ((eventSlave.vagina === -1) && (eventSlave.dick === 0)) {
+				r.push(`${He} was desperately rubbing ${his} perineum and anus, the most sensitive parts ${he} has left, so you slap that part of ${him} repeatedly, enjoying the way it spasms.`);
+			} else if (eventSlave.vagina === -1 || eventSlave.clit >= 3) {
+				r.push(`${He} was jacking it, so you force ${him} to get ${himself} hard for punishment and then deliver a series of agonizing slaps and flicks to ${his} offending member.`);
+			} else if (eventSlave.labia > 1) {
+				r.push(`${His} generous pussylips bear a sheen of incriminating moisture, so you slap and flick them, causing ${him} intense agony.`);
+			} else {
+				r.push(`You deliver a series of agonizing slaps to ${his} mons.`);
+			}
+			r.push(`You have to start over twice. By the end, ${he}'s managed to orgasm to all the stimulation, but ${he}'s crying and desperately promising never to touch ${himself} again without your permission. ${His} submission to you <span class="hotpink">has increased.</span>`);
+			eventSlave.devotion += 4;
+			if ((eventSlave.fetish === "masochist") && (eventSlave.fetishKnown === 1)) {
+				eventSlave.fetishStrength += 4;
+				r.push(`<span class="fetish inc">${His} enjoyment of pain has increased.</span>`);
+			} else if (random(1, 100) > 50) {
+				eventSlave.fetish = "masochist";
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 65;
+				r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of ${his} ${getWrittenTitle(eventSlave)} beating ${him}.</span>`);
+			}
+			return r;
+		}
+	}
+};
+
diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js
index 072492877bc..4c91f07f2cc 100644
--- a/src/events/randomEvent.js
+++ b/src/events/randomEvent.js
@@ -23,6 +23,7 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSDevotedVirgin(),
 		new App.Events.RESSDevotedWaist(),
 		new App.Events.RESSEscapee(),
+		new App.Events.RESSForbiddenMasturbation(),
 		new App.Events.RESSFrighteningDick(),
 		new App.Events.RESSHotPC(),
 		new App.Events.RESSImScared(),
diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js
index c4242bccc77..1764bb4a104 100644
--- a/src/js/eventSelectionJS.js
+++ b/src/js/eventSelectionJS.js
@@ -785,13 +785,6 @@ if(eventSlave.drugs === "breast injections") {
 
 			if (eventSlave.rules.release.masturbation === 0 && !App.Utils.hasNonassignmentSex(eventSlave)) {
 				if (eventSlave.need) {
-					if (eventSlave.devotion <= 95) {
-						if (eventSlave.trust >= -20) {
-							if ((eventSlave.chastityPenis !== 1) || (eventSlave.dick === 0)) {
-								V.RESSevent.push("forbidden masturbation");
-							}
-						}
-					}
 					if (eventSlave.devotion >= -20) {
 						if (eventSlave.trust >= -50) {
 							V.RESSevent.push("desperately horny");
diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw
index db0b8d9ab0c..faf009268dd 100644
--- a/src/uncategorized/RESS.tw
+++ b/src/uncategorized/RESS.tw
@@ -2305,82 +2305,6 @@ To go by $his behavior, the likelihood that $he's actually eager to <<if $PC.dic
 $desc
 has run through the prescribed motions of a normal inspection, and you've reached the part of the routine where you usually ask the slave a few questions, give $him a few orders, or fuck $him. $His <<if canSee($activeSlave)>><<= App.Desc.eyesColor($activeSlave)>> are watching you closely<<else>>face is centered on you<</if>>, and $he's <<if canHear($activeSlave)>>listening carefully<<else>>waiting patiently<</if>> for direction. This is probably due to linguistic anxiety: $he can understand the most straightforward commands, but giving $him orders is often an exercise in <<if canSee($activeSlave)>>pointing and gesturing, or when that fails, simply<<else>>frustration, ending with you simply<</if>> pushing and pulling $his usually-compliant body into the proper place.
 
-<<case "forbidden masturbation">>
-
-<<if $assistant.personality > 0>>
-	There is an alert from $assistant.name, in _hisA deliciously feminine voice: "$activeSlave.slaveName is masturbating, <<= properMaster()>>. Ooh, $he's breaking the rules, <<= properMaster()>>!" _HisA avatar
-	<<switch $assistant.appearance>>
-	<<case "monstergirl">>
-		strokes _hisA dicks suggestively.
-	<<case "shemale">>
-		shifts uncomfortably, _hisA cock rock hard.
-	<<case "amazon">>
-		struts back and forth indignantly, _hisA bone bangles rattling.
-	<<case "businesswoman">>
-		licks _hisA cherry-red lips suggestively.
-	<<case "fairy" "pregnant fairy">>
-		giggles uncontrollably.
-	<<case "hypergoddess" "goddess">>
-		tutting disapprovingly, despite _hisA blushing.
-	<<case "loli">>
-		stares innocently at the scene.
-	<<case "preggololi">>
-		stares at the scene, blushing, while a hand caresses _hisA large belly.
-	<<case "angel">>
-		is covering _hisA face, occasionally peeping through _hisA fingers.
-	<<case "cherub">>
-		is trying _hisA hardest to look away, but keeps glancing back at the scene.
-	<<case "incubus">>
-		is openly jacking off to the sight.
-	<<case "succubus">>
-		is groping _himselfA to the sight.
-	<<case "imp">>
-		is hovering while viciously fingering _hisA cunt.
-	<<case "witch">>
-		is pretending to read from _hisA spell book, but is obviously watching over the top of it.
-	<<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">>
-		is mimicking _hisA actions nearly perfectly.
-	<<case "schoolgirl">>
-		giggles nervously.
-	<<default>>
-		spins accusingly.
-	<</switch>>
-<<else>>
-	There is a gentle alert from $assistant.name: "$activeSlave.slaveName is masturbating in violation of the rules, <<= properMaster()>>."
-<</if>>
-A video feed appears.
-<<if ($activeSlave.chastityVagina)>>
-	In $his chastity belt, all $he can manage is furious nipple-<<if $activeSlave.nipples != "fuckable">>rubbing<<else>>fisting<</if>> and some furtive fingering of $his asshole.
-<<elseif ($activeSlave.chastityPenis == 1)>>
-	In $his chastity cage, all $he can manage is furious nipple-<<if $activeSlave.nipples != "fuckable">>rubbing<<else>>fisting<</if>> and some furtive fingering of $his asshole.
-<<elseif ($activeSlave.dick > 0) && ($activeSlave.hormoneBalance >= 100)>>
-	Since $he's impotent from hormone treatment, all $he can manage is rubbing $his soft dick and some furtive fingering of $his asshole.
-<<elseif ($activeSlave.dick > 0) && ($activeSlave.balls > 0) && ($activeSlave.ballType == "sterile")>>
-	Since $he's impotent due to $his useless balls, all $he can manage is rubbing $his soft dick and some furtive fingering of $his asshole.
-<<elseif ($activeSlave.dick > 0) && ($activeSlave.balls == 0)>>
-	Since $he's impotent due to $his lack of balls, all $he can manage is rubbing $his soft dick and some furtive fingering of $his asshole.
-<<elseif !canAchieveErection($activeSlave) && ($activeSlave.dick > 6)>>
-	Since $his dick requires far too much blood to get erect, $he's furiously massaging the semi-engorged monster.
-<<elseif !canAchieveErection($activeSlave) && ($activeSlave.dick > 0)>>
-	Since $he's can't get it up, all $he can manage is rubbing $his soft dick and some furtive fingering of $his asshole.
-<<elseif ($activeSlave.vagina == -1) && ($activeSlave.dick == 0)>>
-	$He's rubbing $his perineum desperately with one hand, and $his anus with the other, since $he lacks external genitalia.
-<<elseif $activeSlave.vagina == -1>>
-	$He's furiously jacking off.
-<<elseif $activeSlave.clit >= 3>>
-	$He's furiously jacking off $his clitdick.
-<<else>>
-	$He's furiously polishing $his pearl.
-<</if>>
-$He's chosen to do it in a dark corner and looks like $he's hurrying; $he clearly knows this is forbidden.
-<br><br>
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> does not hear your approach <<if canHear($activeSlave)>>until you're very close.<<else>>but soon realizes your presence.<</if>> $He starts and tries to look normal.
-<<if !canTalk($activeSlave)>>
-	$He nervously gestures that $he wasn't doing anything.
-<<else>>
-	"I wa<<s>>n't doing anything, <<if $activeSlave.rudeTitle == 1>><<= PoliteRudeTitle($activeSlave)>><<else>><<Master>><</if>>!" $he lies.
-<</if>>
-
 <<case "hates oral">>
 
 <<= App.UI.slaveDescriptionDialog($activeSlave)>> has been in your service long enough to know that oral sex is a daily fact of life for most slaves, and that most slaves are not only required to put up with cum, but to love it, too — or at least be able to fake enjoyment convincingly. $He's <<if canSee($activeSlave)>>seen cum spattered on other slaves' faces, pooling in their mouths, and dripping from their asses only to be licked up by other slaves<<elseif canHear($activeSlave)>>heard cum spattering across other slaves' faces, the sound of it in their mouths, dripping from their asses, and more<<else>>felt seminal fluid on $his skin and on $his lips, always coercively or accidentally<</if>>. It's clear from $activeSlave.slaveName's recent reactions to these acts that $he's quite disgusted by oral sex in general and cum in particular. Depending on your point of view, this could be a flaw for $him to overcome or a weakness you can exploit.
@@ -12286,211 +12210,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look.
 	<</replace>>
 <</link>>
 
-<<case "forbidden masturbation">>
-
-<<link "Let $him earn relief">>
-	<<replace "#result">>
-		$He's extremely relieved that you're not going to punish $him for the rulebreaking when you tell $him that $he can touch $himself if $he
-		<<if $activeSlave.belly >= 300000>>
-			leans over $his _belly belly
-		<<else>>
-			gets on $his knees
-		<</if>>
-		and sucks you off. $He does a decent job, playing with $himself all the while. $He's learned that $he can get away with infractions if $he's willing to suck dick afterward. $His resistance to your will @@.mediumorchid;has increased.@@
-		<<set $activeSlave.devotion -= 5>>
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<br>Punish $him, but then let $him get off:
-<<if ($activeSlave.fetish != "cumslut") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "when $he sucks">>
-		<<replace "#result">>
-			You
-			<<if $PC.belly >= 10000>>
-				<<if $activeSlave.belly >= 300000>>
-					tip $him over $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>middle<</if>>, do your best to get close beside $him,
-				<<elseif $activeSlave.belly >= 5000>>
-					order $him to bend over beside you so your pregnancy doesn't obstruct you as badly
-				<<else>>
-					lean back, pull $him over your knee and under your gravid dome of a middle
-				<</if>>
-			<<else>>
-				<<if $activeSlave.belly >= 300000>>
-					tip $him over $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>middle<</if>>
-				<<elseif $activeSlave.belly >= 5000>>
-					spread your legs to give $his <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>bloated middle<</if>> room as you pull $him onto your lap
-				<<else>>
-					pull $him down over your knee
-				<</if>>
-			<</if>>
-			and spank $his $activeSlave.skin buttocks until they're warm to the touch. It's not a sexual punishment, it's too painful for that; by the end, $activeSlave.slaveName has cried $himself out and is limp in your hands. You pull $him up to face you and give $him your instructions: from now on, $he can come to you and ask to <<if $PC.dick != 0>>blow you<<if $PC.vagina != -1>> and <</if>><</if>><<if $PC.vagina != -1>>perform cunnilingus on you<</if>>, and masturbate while $he does. $He nods through $his tears and flees. In an hour or so, though, $he finds you and asks to <<if $PC.vagina != -1>>give you oral<<else>>suck your cock<</if>>. When you pretend indifference, $he abjectly begs. Soon, $he's down on $his knees, crying a little with shame as $he masturbates furiously.
-			<<run seX($activeSlave, "oral", $PC, "penetrative", 5)>>
-			<<if ($activeSlave.fetish == "cumslut") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of <<if $PC.dick == 0>>giving head<<else>>sucking cock<</if>> has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetish = "cumslut", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65>>
-				Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of <<if $PC.dick == 0>>giving head<<else>>sucking cock<</if>>.@@
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if ($activeSlave.fetish != "boobs") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "during nipple play">>
-		<<replace "#result">>
-			You
-			<<if $PC.belly >= 10000>>
-				<<if $activeSlave.belly >= 300000>>
-					tip $him over $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>middle<</if>>, do your best to get close beside $him, and grope $him thoroughly, bringing $him to the painful edge of orgasm. Just when $he's about to tip over the edge, the stimulation stops and you flip $him onto $his back, lower your gravid body down to $his level and start playing with $his nipples.
-				<<elseif $activeSlave.belly >= 5000>>
-					order $him to bend over beside you so your pregnancy doesn't obstruct you as badly and grope $him thoroughly, bringing $him to the painful edge of orgasm. Just when $he's about to tip over the edge, the stimulation stops and you haul $him upright and start playing with $his nipples.
-				<<else>>
-					lean back, pull $him over your knee and under your gravid dome of a middle and grope $him thoroughly, bringing $him to the painful edge of orgasm. Just when $he's about to tip over the edge, the stimulation stops and you haul $him upright and start playing with $his nipples.
-				<</if>>
-			<<else>>
-				<<if $activeSlave.belly >= 300000>>
-					tip $him over $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>middle<</if>> and grope $him thoroughly, bringing $him to the painful edge of orgasm. Just when $he's about to tip over the edge, the stimulation stops and you haul $him up into your lap, $his stomach spreading your legs, and start playing with $his nipples.
-				<<elseif $activeSlave.belly >= 5000>>
-					spread your legs to give $his <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>bloated middle<</if>> room as you pull $him onto your lap and grope $him thoroughly, bringing $him to the painful edge of orgasm. Just when $he's about to tip over the edge, the stimulation stops and you haul $him up into your lap and start playing with $his nipples.
-				<<else>>
-					pull $him down over your knee and grope $him thoroughly, bringing $him to the painful edge of orgasm. Just when $he's about to tip over the edge, the stimulation stops and you haul $him up into your lap and start playing with $his nipples.
-				<</if>>
-			<</if>>
-			$He writhes and sobs at the orgasm denial, since the nipple play is just barely enough to keep $him at a high level of arousal without giving relief. You switch back and forth until $he finally goes over into muscle-spasming climax during nipple stimulation alone.
-			<<run seX($activeSlave, "mammary", $PC, "penetrative")>>
-			<<if ($activeSlave.fetish == "boobs") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of breast play has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetish = "boobs", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65>>
-				Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at every brush against $his breasts.@@
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if (($activeSlave.fetish != "pregnancy") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)) && $activeSlave.belly >= 5000>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "while fondling $his belly">>
-		<<replace "#result">>
-			You
-			<<if $activeSlave.belly >= 300000>>
-				roll $him onto $his back
-			<<else>>
-				pull $him into a sitting position on your lap
-			<</if>>
-			and grope $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>stomach<</if>>thoroughly, allowing $him to reach the painful edge of orgasm. You feel $his belly shudder as $he reaches climax under your ministrations. You tease $his <<if $activeSlave.belly >= 10001>>popped <</if>>navel as $he comes down from $his masturbation session.
-			<<if ($activeSlave.fetish == "pregnancy") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of pregnancy has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetish = "pregnancy", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65>>
-				Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at <<if $activeSlave.pregKnown == 1>>every thought about $his pregnancy<<else>>the very thought of being pregnant<</if>>.@@
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if canDoAnal($activeSlave)>>
-	<<if ($activeSlave.fetish != "buttslut") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "when $he takes it up the ass">>
-			<<replace "#result">>
-				You
-				<<if $PC.belly >= 10000>>
-					<<if $activeSlave.belly >= 300000>>
-						tip $him over $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>middle<</if>>, do your best to get close beside $him,
-					<<elseif $activeSlave.belly >= 5000>>
-						order $him to bend over beside you so your pregnancy doesn't obstruct you as badly
-					<<else>>
-						lean back, pull $him over your knee and under your gravid dome of a middle
-					<</if>>
-				<<else>>
-					<<if $activeSlave.belly >= 300000>>
-						tip $him over $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>middle<</if>>
-					<<elseif $activeSlave.belly >= 5000>>
-						spread your legs to give $his <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>bloated middle<</if>> room as you pull $him onto your lap
-					<<else>>
-						pull $him down over your knee
-					<</if>>
-				<</if>>
-				and spank $his $activeSlave.skin buttocks until they're warm to the touch. It's not a sexual punishment, it's too painful for that; by the end, $activeSlave.slaveName has cried $himself out and is limp in your hands. You pull $him up to face you and give $him your instructions: from now on, $he can come to you and ask you to assrape $him, and masturbate while $he takes <<if $PC.dick == 0>>anal penetration<<else>>cock<</if>>. $He nods through $his tears and flees. In an hour or so, though, $he finds you and haltingly asks you to buttfuck $him. When you pretend indifference, $he offers you $his anus and abjectly begs you to stick <<if $PC.dick == 0>>a strap-on<<else>>your cock<</if>> up $his butt. Soon, $he's down on all fours, crying a little with mixed shame and anal pain as $he masturbates furiously.
-				<<= VCheck.Anal($activeSlave, 5)>>
-				<<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>>
-					<<set $activeSlave.fetishStrength += 4>>
-					@@.lightcoral;$His enjoyment of anal has increased.@@
-				<<elseif random(1,100) > 50>>
-					<<set $activeSlave.fetish = "buttslut", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65>>
-					Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of anal sex.@@
-				<</if>>
-			<</replace>>
-		<</link>><<if ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-	<</if>>
-<</if>>
-<<if ($activeSlave.fetish != "humiliation") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "in public">>
-		<<replace "#result">>
-			You bring $him out <<if $club > 0>>to $clubName<<else>>onto the street<</if>> and secure $him upright with a set of vibrators attached to all of $his erogenous zones. There's a lot of them, and they're extremely powerful; when you test the setup, $he wriggles with the intensity of the stimulation, and is about to climax when you shut it down. Without telling $him, you slave the vibrators to a program originally designed for VIP security details. It uses the cameras scattered through the area to detect when passersby are looking at $him. The more eyes on $him, the stronger the vibrations.
-			<<if ($activeSlave.fetish == "humiliation") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of humiliation has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetish = "humiliation", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65>>
-				Before $he realizes what's happening, @@.lightcoral;$he's starting to long for humiliation.@@
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if ($activeSlave.fetish != "submissive") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "while submitting to a spanking">>
-		<<replace "#result">>
-			You tell $him that $he can get $himself off while $he's being spanked, and that's it: you don't tell $him to offer $his bottom, much less start spanking $him. $He doesn't understand for a long moment, but before long $he's begging abjectly for a spanking, and has $his buttocks presented, quivering with simultaneous arousal and fear of pain. The pain comes soon enough, with a delicious crack of palm on flesh <<if $activeSlave.voice == 0>>and a hoarse grunt, the most noise $he can make.<<else>>and a shriek of agony.<</if>> $He masturbates furiously, but you're an accomplished spanker, and you repeatedly cause $him just enough pain to prevent climax. Eventually $he gets off in part because of, rather than in spite of, the lengthy beating.
-			<<if ($activeSlave.fetish == "submissive") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of submission has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetish = "submissive", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65>>
-				Before $he realizes what's happening, @@.lightcoral;$he starts to associate submitting to you with getting off.@@
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if ($activeSlave.fetish != "masochist") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "while in pain">>
-		<<replace "#result">>
-			You order $him to
-			<<if ($activeSlave.heels == 1) && shoeHeelCategory($activeSlave) == 0>>
-				kneel
-			<<elseif shoeHeelCategory($activeSlave) > 1>>
-				teeter
-			<<else>>
-				stand
-			<</if>>
-			with $his arm<<if hasBothArms($activeSlave)>>s<</if>> over $his head and $his arm<<if hasBothLegs($activeSlave)>>s<</if>> splayed, and tell $him that if $he moves or resists $his punishment will begin again from the start.
-			<<if ($activeSlave.chastityVagina) || ($activeSlave.chastityPenis == 1)>>
-				$He was touching $his nipples and ass, so you flick and torture $his nipples and give $him a severe spanking.
-			<<elseif !canAchieveErection($activeSlave) && ($activeSlave.dick > 6)>>
-				$He was playing with $his oversized cock, so you kick and swat at the swollen monster, enjoying the way it spasms.
-			<<elseif ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>>
-				$He was touching $his limp dick and ass, so you slap and torture $his offending dick and give $him a severe spanking.
-			<<elseif ($activeSlave.vagina == -1) && ($activeSlave.dick == 0)>>
-				$He was desperately rubbing $his perineum and anus, the most sensitive parts $he has left, so you slap that part of $him repeatedly, enjoying the way it spasms.
-			<<elseif $activeSlave.vagina == -1 || $activeSlave.clit >= 3>>
-				$He was jacking it, so you force $him to get $himself hard for punishment and then deliver a series of agonizing slaps and flicks to $his offending member.
-			<<elseif $activeSlave.labia > 1>>
-				$His generous pussylips bear a sheen of incriminating moisture, so you slap and flick them, causing $him intense agony.
-			<<else>>
-				You deliver a series of agonizing slaps to $his mons.
-			<</if>>
-			You have to start over twice. By the end, $he's managed to orgasm to all the stimulation, but $he's crying and desperately promising never to touch $himself again without your permission. $His submission to you @@.hotpink;has increased.@@
-			<<set $activeSlave.devotion += 4>>
-			<<if ($activeSlave.fetish == "masochist") && ($activeSlave.fetishKnown == 1)>>
-				<<set $activeSlave.fetishStrength += 4>>
-				@@.lightcoral;$His enjoyment of pain has increased.@@
-			<<elseif random(1,100) > 50>>
-				<<set $activeSlave.fetish = "masochist", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65>>
-				Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of <<= getWrittenTitle($activeSlave)>> beating $him.@@
-			<</if>>
-		<</replace>>
-	<</link>>
-<</if>>
-
 <<case "hates oral">>
 
 <<link "Let $him earn a break for $his throat">>
-- 
GitLab