From d641e28f2312b318d215c134f854251048a1bddb Mon Sep 17 00:00:00 2001
From: Pregmodder <pregmodder@gmail.com>
Date: Sat, 20 Jun 2020 22:42:26 -0400
Subject: [PATCH] RECI futa

---
 src/events/RECI/futa.js    | 288 +++++++++++++++++++++++++++++++++++++
 src/js/eventSelectionJS.js |   7 -
 src/uncategorized/RECI.tw  |  35 +----
 3 files changed, 289 insertions(+), 41 deletions(-)
 create mode 100644 src/events/RECI/futa.js

diff --git a/src/events/RECI/futa.js b/src/events/RECI/futa.js
new file mode 100644
index 00000000000..cc516c64928
--- /dev/null
+++ b/src/events/RECI/futa.js
@@ -0,0 +1,288 @@
+App.Events.RECIFuta = class RECIFuta extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [];
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => V.REFutaSisterCheckinIDs.includes(s.ID),
+				s => s.assignment !== Job.QUARTER,
+				s => s.trust >= 10,
+				s => s.dick > 0,
+				s => s.balls > 0,
+				s => s.vagina >= 0,
+				canAchieveErection,
+				canTalk,
+				canHear,
+				hasAllNaturalLimbs,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, His, his, hers, him, himself, girl
+		} = getPronouns(eventSlave);
+		const {title: Master, say: say} = getEnunciation(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		V.nextLink = "Next Week";
+		V.REFutaSisterCheckinIDs.deleteWith((s) => s === eventSlave.ID);
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let t = [];
+		t.push(`You're just finishing up ${App.UI.DOM.slaveDescriptionDialog(eventSlave)}'s weekly inspection. The`);
+		if (eventSlave.face >= -10) {
+			t.push(`pretty`);
+		} else {
+			t.push(`perky`);
+		}
+		t.push(`futa is standing obediently before you, answering the usual questions with enthusiasm. ${He} gestures animatedly as ${he} talks, making ${his}`);
+		if (eventSlave.boobs > 8000) {
+			t.push(`mind-blowing`);
+		} else if (eventSlave.boobs > 4000) {
+			t.push(`monstrous`);
+		} else if (eventSlave.boobs > 2000) {
+			t.push(`enormous`);
+		} else if (eventSlave.boobs > 800) {
+			t.push(`big`);
+		}
+		if (eventSlave.boobs >= 300) {
+			t.push(`boobs jiggle slightly, and ${his}`);
+		}
+		if (eventSlave.dick > 5) {
+			t.push(`incredible, erect penis wave from side to side.`);
+		} else if (eventSlave.dick > 3) {
+			t.push(`big cock wave from side to side.`);
+		} else if (eventSlave.dick > 1) {
+			t.push(`dick stick out stiffly.`);
+		} else {
+			t.push(`tiny hard-on wiggle lewdly.`);
+		}
+		t.push(`${He} doesn't seem to notice, probably because this state of obvious arousal is more or less permanent for ${him}. After all, this is what the ex-Futanari Sister wanted.`);
+		App.Events.addParagraph(node, t);
+
+		t = [];
+		t.push(`Apparently, ${he} has something to say. When you've asked ${him} your last question and are considering whether to dismiss ${him} or fuck ${him} and then dismiss ${him}, ${he} speaks up confidently.`);
+		t.push(Spoken(eventSlave, `"${Master},"`));
+		t.push(`${he} ${say}s.`);
+		t.push(Spoken(eventSlave, `"I want to thank you. When our group of Futa Sisters here failed, I was so scared. We all were! We didn't know what was going to happen, whether we were going to be raped or cut up or worse. But you saved us ${Master}, and you saved me. I'm just as happy with you as I was with the Sisters. I thought I'd have to wake up from the dream I was in, but I'm still dreaming. Thank you."`));
+		t.push(`${He} gives you a pretty half-curtsy, half-bow that manages to be both graceful and appealingly sexual.`);
+		App.Events.addParagraph(node, t);
+
+		t = [];
+		t.push(`${His} ${eventSlave.skin} face displays nothing but honest gratitude and devotion. ${He} does not know that the reason ${his} community of Futanari Sisters failed is that you cleverly undermined its finances, forcing it into ruin and its members into slavery. ${He} does not know that the reason ${he} lost years of idyllic transformation and sexual freedom within a group of like-minded women is that you stole them from ${him}. And ${he} does not know that the person ${he} just thanked for saving ${him} from the consequences of the worst thing that ever happened to ${him} was its author.`);
+		t.push(Spoken(eventSlave, `"I love you, ${Master},"`));
+		t.push(`${he} concludes, smiling expectantly at you.`);
+		App.Events.addParagraph(node, t);
+
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Love ${him} back`, love, virginityWarningSingle()),
+			new App.Events.Result(`Break ${him} with the truth`, hate, virginityWarningDouble()),
+		]);
+
+		function love() {
+			t.push(`You swing your legs up onto your desk and`);
+			if (V.PC.belly < 5000) {
+				t.push(`jump`);
+			} else {
+				t.push(`heft yourself`);
+			}
+			t.push(`up onto its smooth surface, ${his} eyes tracking the`);
+			if (V.PC.belly >= 5000) {
+				t.push(`delicate, yet determined, motions you take to accommodate your pregnancy.`);
+			} else if (V.PC.boobs >= 300) {
+				t.push(`way it makes your breasts move.`);
+			} else {
+				t.push(`powerful way your muscles move your body.`);
+			}
+			t.push(`When you pat the tops of your`);
+			if (V.PC.title === 1) {
+				t.push(`hard`);
+			} else {
+				t.push(`soft`);
+			}
+			t.push(`thighs meaningfully, ${he} giggles happily and skips forward to clamber up and sit on your lap. The bouncing and climbing creates quite a nice spectacle of`);
+			if (eventSlave.boobs >= 300) {
+				t.push(`jiggling tits and`);
+			}
+			t.push(`waving cock, and ${he} manages to get up on the desk in such a way that you get a solid eyeful of first ${his} wet pussy and then ${his} ready anus.`);
+			if (V.PC.belly + eventSlave.belly >= 10000) {
+				t.push(`${He} positions ${himself} so that`);
+				if (eventSlave.belly >= 8000) {
+					t.push(`${his}`);
+					if (eventSlave.bellyPreg >= 3000) {
+						t.push(`pregnancy`);
+					} else {
+						t.push(`swollen middle`);
+					}
+					t.push(`will allow ${his} hermaphroditic genitalia to meet the`);
+					if (V.PC.dick !== 0) {
+						t.push(`hardness of your`);
+						if (V.PC.vagina !== -1) {
+							t.push(`erection and the warmth further down.`);
+						} else {
+							t.push(`erection.`);
+						}
+					} else {
+						t.push(`warmth of your arousal.`);
+					}
+				} else if (V.PC.belly >= 8000) {
+					t.push(`${He} slides $himself beneath your bump with a coo, feeling the`);
+					if (V.PC.dick !== 0) {
+						t.push(`hardness of your erection`);
+						if (V.PC.vagina !== -1) {
+							t.push(`and the warmth further down`);
+						}
+					} else {
+						t.push(`warmth of your arousal`);
+					}
+					t.push(`against ${his} hermaphroditic genitalia.`);
+				} else {
+					t.push(`It takes a moment for both of you to find a position where ${his} hermaphroditic genitalia are able to cross paths with the`);
+					if (V.PC.dick !== 0) {
+						t.push(`hardness of your`);
+						if (V.PC.vagina !== -1) {
+							t.push(`erection and the warmth further down`);
+						} else {
+							t.push(`erection`);
+						}
+					} else {
+						t.push(`warmth of your arousal`);
+					}
+					t.push(`without both of your bellies getting in the way.`);
+				}
+			} else {
+				t.push(`${He} settles $himself onto your lap with a coo, feeling the`);
+				if (V.PC.dick !== 0) {
+					t.push(`hardness of your erection`);
+					if (V.PC.vagina !== -1) {
+						t.push(`and the warmth further down`);
+					}
+				} else {
+					t.push(`warmth of your arousal`);
+				}
+				t.push(`against ${his} hermaphroditic genitalia.`);
+			}
+			t.push(`${He} starts to grind ${himself} lasciviously against you, but stops when you seize ${his} face and kiss ${him} deeply. ${He} moans back into you, returning the kiss with intensity.`);
+			if (eventSlave.boobs > 25000) {
+				t.push(`${His} udders are so huge the two of you have to press your torsos hard together to make out, a delightful struggle that stimulates ${his} nipples quite a lot, to go by the way ${he} squeaks and giggles into your mouth.`);
+			} else if (eventSlave.boobs > 4000) {
+				t.push(`${His} bosom is so big that making out face to face presses it quite hard between your torsos, which stimulates ${his} nipples quite a lot, to go by the way ${he} squeaks and giggles into your mouth.`);
+			} else if (eventSlave.boobs + V.PC.boobs > 4000 && V.PC.boobs >= 1000) {
+				t.push(`The amount of breast flesh between you forces you and ${him} to press your torsos hard together to make out, a delightful struggle that stimulates both party's nipples quite a lot, to go by the way ${he} squeaks and giggles into your mouth, and you into ${hers}.`);
+			} else if (V.PC.boobs >= 300 || V.PC.title === 0) {
+				t.push(`You undress without breaking your lip lock, bringing your bare breasts against ${hers} in a warm, loving embrace.`);
+			} else {
+				t.push(`You strip without breaking your lip lock, bringing your heavily muscled chest against ${his} soft breasts in a tender, loving embrace.`);
+			}
+			t.push(`${His} arousal builds rapidly and ${he} goes back to grinding,`);
+			if (V.PC.dick !== 0) {
+				t.push(`eventually getting ${himself} so hot that your dick slides into ${him} almost without either of you meaning to make it happen. ${He} climaxes with you shortly, cumming all over ${his} own breasts.`);
+			} else {
+				t.push(`bringing you both to a shaking climax. ${He} cums all over $his own breasts, coating them in glistening ejaculate.`);
+			}
+			t.push(`As ${he} relaxes back against the desk, ${his} panting making ${his} cum-glazed tits rise and fall, you reflect that you just lied by omission, letting`);
+			if (eventSlave.face >= -10) {
+				t.push(`a pretty`);
+			} else {
+				t.push(`a trusting`);
+			}
+			t.push(`${girl} maintain ${his} delusions and <span class="devotion inc">${his} love for you.</span> Of all your sins, this is perhaps the smallest.`);
+			eventSlave.devotion += 4;
+			t.push(VCheck.Vaginal(1, eventSlave));
+		}
+
+		function hate() {
+			t.push(`You point at the`);
+			if (eventSlave.belly >= 300000) {
+				t.push(`${his} stomach, and ${he} leans forward onto ${his} ${belly} belly, giggling with ${his} butt stuck out invitingly.`);
+			} else {
+				t.push(`the couch, and $he`);
+				if (canWalk(eventSlave)) {
+					t.push(`skips over to it with a giggle,`);
+					if (eventSlave.boobs >= 300) {
+						t.push(`boobs bouncing.`);
+					} else if (eventSlave.weight > 95) {
+						t.push(`belly bouncing.`);
+					}
+				} else {
+					t.push(`crawls over to it with a giggle.`);
+				}
+				t.push(`${He} hops up onto the cushions, kneeling with ${his} butt stuck out invitingly and ${his} torso bent over its back.`);
+			}
+			t.push(`$He reaches around to pull one`);
+			if (eventSlave.butt > 12) {
+				t.push(`massive`);
+			} else if (eventSlave.butt > 8) {
+				t.push(`giant`);
+			} else if (eventSlave.butt > 5) {
+				t.push(`huge`);
+			} else if (eventSlave.butt > 2) {
+				t.push(`heavy`);
+			} else {
+				t.push(`cute`);
+			}
+			t.push(`buttock to one side,`);
+			if (eventSlave.anus > 2) {
+				t.push(`stretching ${his} lewd backdoor into a gape`);
+			} else if (eventSlave.anus > 1) {
+				t.push(`stretching ${his} backdoor lewdly`);
+			} else {
+				t.push(`highlighting ${his} tight anus`);
+			}
+			t.push(`and showing off ${his}`);
+			if (eventSlave.labia > 1) {
+				t.push(`dangling`);
+			} else if (eventSlave.labia > 0) {
+				t.push(`generous`);
+			} else if (eventSlave.vaginalLube > 0) {
+				t.push(`wet`);
+			}
+			t.push(`pussylips. You enter ${him} from behind, your`);
+			if (V.PC.dick !== 0) {
+				t.push(`turgid dick`);
+			} else {
+				t.push(`strap-on`);
+			}
+			t.push(`sliding easily into ${his} cunt. Your hands slide around ${him} to hold $his shoulders in a gentle lock, and you whisper secrets into ${his} ear. You tell ${him} that the Futanari Sisters here failed because you undermined them. You tell ${him} that ${he} is a slave because you planned and executed ${his} enslavement. And you tell ${him} that no slave will `);
+			if (V.enduringDevotion > 20) {
+				t.push(`believe ${him} if ${he} tells them the truth, since they love you just like ${he} did.`);
+			} else {
+				t.push(`listen to ${him} if ${he} tells them the truth, since they aren't as naive as ${he} was.`);
+			}
+			t.push(`As you pour this poison into ${him}, ${he} remains perfectly still, processing the revelation; the only clue to ${his} feelings is ${his} rapidly softening cock. When it has become completely, pathetically limp, a huge sob tears its way out of ${him}. You switch to ${his} anus and assrape ${him} without mercy, forcing ${his} limp torso halfway around so you can press a kiss on ${his} bawling mouth. ${He} does not resist, even when you begin to taste the salty tears that stream down ${his}`);
+			if (eventSlave.face >= -10) {
+				t.push(`pretty`);
+			} else {
+				t.push(`broken`);
+			}
+			t.push(`face. ${He} will remain devoted to you, mostly from a lack of alternatives, but ${his} trust in you has <span class="trust dec">suffered immensely.</span>`);
+			eventSlave.trust = jsRandom(-90, -75);
+			t.push(VCheck.Both(1, eventSlave));
+		}
+
+		function virginityWarningSingle() {
+			if (V.PC.dick >= 0 && eventSlave.vagina === 0) {
+				return `This option will take ${his} virginity`;
+			}
+			return null;
+		}
+
+		function virginityWarningDouble() {
+			if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
+				return `This option will take both ${his} virginities`;
+			} else if (eventSlave.vagina === 0) {
+				return `This option will take ${his} virginity`;
+			} else if (eventSlave.anus === 0) {
+				return `This option will take ${his} anal virginity`;
+			}
+			return null;
+		}
+	}
+};
diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js
index 1b0f22bf1a1..5878a038aa9 100644
--- a/src/js/eventSelectionJS.js
+++ b/src/js/eventSelectionJS.js
@@ -343,13 +343,6 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) {
 									V.RECIevent.push("feminization");
 								}
 							}
-							if (eventSlave.trust >= 10) {
-								if (canAchieveErection(eventSlave)) {
-									if (V.REFutaSisterCheckinIDs.includes(eventSlave.ID)) {
-										V.RECIevent.push("futa");
-									}
-								}
-							}
 						}
 					}
 				}
diff --git a/src/uncategorized/RECI.tw b/src/uncategorized/RECI.tw
index 0aee8085dbc..52da6bcd30f 100644
--- a/src/uncategorized/RECI.tw
+++ b/src/uncategorized/RECI.tw
@@ -44,7 +44,7 @@
 <<set _clothesTemp = $activeSlave.clothes>>
 <<switch $RECIevent>>
 	/*Some events start with the slave naked (any event that starts with the daily inspection, for example). Here we switch their clothing just for the image to load, then switch it back quickly so the player's choice is not messed up.*/
-<<case "feminization" "futa" "MILF" "orientation" "ugly">>
+<<case "feminization" "MILF" "orientation" "ugly">>
 	<<set $activeSlave.clothes = "no clothing">>
 <</switch>>
 <span id="artFrame">
@@ -68,21 +68,6 @@
 
 <<switch $RECIevent>>
 
-<<case "futa">>
-
-<<for $i = 0; $i < $REFutaSisterCheckinIDs.length; $i++>>
-	<<if $REFutaSisterCheckinIDs[$i] == $activeSlave.ID>>
-		<<set $REFutaSisterCheckinIDs.deleteAt($i)>>
-		<<break>>
-	<</if>>
-<</for>>
-
-You're just finishing up <<= App.UI.slaveDescriptionDialog($activeSlave)>>'s weekly inspection. The pretty futa is standing obediently before you, answering the usual questions with enthusiasm. $He gestures animatedly as $he talks, making $his<<if $activeSlave.boobs > 4000>> monstrous<<elseif $activeSlave.boobs > 2000>> enormous<<elseif $activeSlave.boobs > 800>> big<</if>> boobs jiggle slightly, and $his <<if $activeSlave.dick > 5>>incredible, erect penis wave from side to side<<elseif $activeSlave.dick > 3>>big cock wave from side to side<<elseif $activeSlave.dick > 1>>dick stick out stiffly<<else>>tiny hard-on wiggle lewdly<</if>>. $He doesn't seem to notice, probably because this state of obvious arousal is more or less permanent for $him. After all, this is what the ex-Futanari Sister wanted.
-<br><br>
-Apparently, $he has something to say. When you've asked $him your last question and are considering whether to dismiss $him or fuck $him and then dismiss $him, $he speaks up confidently. "<<Master>>," $he <<say>>s. "I want to thank you. When our group of Futa <<S>>i<<s>>ter<<s>> here failed, I was <<s>>o <<s>>cared. We all were! We didn't know what wa<<s>> going to happen, whether we were going to be raped or cut up or wor<<s>>e. But you <<s>>aved u<<s>>, <<Master>>, and you <<s>>aved me. I'm ju<<s>>t a<<s>> happy with you a<<s>> I wa<<s>> with the <<S>>i<<s>>ter<<s>>. I thought I'd have to wake up from the dream I wa<<s>> in, but I'm <<s>>till dreaming. Thank you." $He gives you a pretty half-curtsy, half-bow that manages to be both graceful and appealingly sexual.
-<br><br>
-$His $activeSlave.skin face displays nothing but honest gratitude and devotion. $He does not know that the reason $his community of Futanari Sisters failed is that you cleverly undermined its finances, forcing it into ruin and its members into slavery. $He does not know that the reason $he lost years of idyllic transformation and sexual freedom within a group of like-minded women is that you stole them from $him. And $he does not know that the person $he just thanked for saving $him from the consequences of the worst thing that ever happened to $him was its author. "I love you, <<Master>>," $he concludes, smiling expectantly at you.
-
 <<case "orientation">>
 
 <<for $i = 0; $i < $REOrientationCheckinIDs.length; $i++>>
@@ -246,24 +231,6 @@ $He looks pensive, and goes through two false starts before $he clears $his thro
 <span id="result">
 <<switch $RECIevent>>
 
-<<case "futa">>
-
-<<link "Love $him back">>
-	<<replace "#result">>
-	You swing your legs up onto your desk and jump up onto its smooth surface, $his eyes tracking the <<if $PC.boobs >= 300>>way it makes your breasts move<<else>>powerful way your muscles move your body<</if>>. When you pat the tops of your <<if $PC.title == 1>>hard<<else>>soft<</if>> thighs meaningfully, $he giggles happily and skips forward to clamber up and sit on your lap. The bouncing and climbing creates quite a nice spectacle of jiggling tits and waving cock, and $he manages to get up on the desk in such a way that you get a solid eyeful of first $his wet pussy and then $his ready anus. $He settles $himself onto your lap with a coo, feeling the <<if $PC.dick != 0>>hardness of your erection <<if $PC.vagina != -1>>and the warmth further down<</if>><<else>>warmth of your arousal<</if>> against $his hermaphroditic genitalia. $He starts to grind $himself lasciviously against you, but stops when you seize $his face and kiss $him deeply. $He moans back into you, returning the kiss with intensity. <<if $activeSlave.boobs > 4000>>$His udders are so huge the two of you have to press your torsos hard together to make out, a delightful struggle that stimulates $his nipples quite a lot, to go by the way $he squeaks and giggles into your mouth.<<elseif $activeSlave.boobs > 2000>>$His bosom is are so big that making out face to face presses it quite hard between your torsos, which stimulates $his nipples quite a lot, to go by the way $he squeaks and giggles into your mouth.<<elseif $PC.boobs >= 300 || $PC.title == 0>>You undress without breaking your lip lock, bringing your bare breasts against $hers in a warm, loving embrace.<<else>>You strip without breaking your lip lock, bringing your heavily muscled chest against $his soft breasts in a tender, loving embrace.<</if>> $His arousal builds rapidly and $he goes back to grinding, <<if $PC.dick != 0>>eventually getting $himself so hot that your dick slides into $him almost without either of you meaning to make it happen. $He climaxes with you shortly, cumming all over $his own breasts.<<else>>bringing you both to a shaking climax. $He cums all over $his own breasts, coating them in glistening ejaculate.<</if>> As $he relaxes back against the desk, $his panting making $his cum-glazed tits rise and fall, you reflect that you just lied by omission, letting a pretty $girl maintain $his delusions and @@.hotpink;$his love for you.@@ Of all your sins, this is perhaps the smallest.
-	<<set $activeSlave.devotion += 4>>
-	<<run seX($activeSlave, "vaginal", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-<br><<link "Break $him with the truth">>
-	<<replace "#result">>
-	You point at the couch, and $he skips over to it with a giggle, boobs bouncing. $He hops up onto the cushions, kneeling with $his butt stuck out invitingly and $his torso bent over its back. $He reaches around to pull one <<if ($activeSlave.butt > 5)>>massive<<elseif ($activeSlave.butt > 2)>>heavy<<else>>cute<</if>> buttock to one side, <<if $activeSlave.anus > 2>>stretching $his lewd backdoor into a gape<<elseif $activeSlave.anus > 1>>stretching $his backdoor lewdly<<else>>highlighting $his tight anus<</if>> and showing off $his <<if $activeSlave.labia > 1>>dangling<<elseif $activeSlave.labia > 0>>generous<<else>>wet<</if>> pussylips. You enter $him from behind, your <<if $PC.dick != 0>>turgid dick<<else>>strap-on<</if>> sliding easily into $his cunt. Your hands slide around $him to hold $his shoulders in a gentle lock, and you whisper secrets into $his ear. You tell $him that the Futanari Sisters here failed because you undermined them. You tell $him that $he is a slave because you planned and executed $his enslavement. And you tell $him that no slave will believe $him if $he tells them the truth, since they love you just like $he did. As you pour this poison into $him, $he remains perfectly still, processing the revelation; the only clue to $his feelings is $his rapidly softening cock. When it has become completely, pathetically limp, a huge sob tears its way out of $him. You switch to $his anus and assrape $him without mercy, forcing $his limp torso halfway around so you can press a kiss on $his bawling mouth. $He does not resist, even when you begin to taste the salt tears that stream down $his pretty face. $He will remain devoted to you, mostly from a lack of alternatives, but $his trust in you has @@.gold;suffered immensely.@@
-	<<set $activeSlave.trust = random(-90,-75)>>
-	<<run seX($activeSlave, "vaginal", $PC, "penetrative")>>
-	<<run seX($activeSlave, "anal", $PC, "penetrative")>>
-	<</replace>>
-<</link>>
-
 <<case "orientation">>
 
 <<link "$He wants dick. Give $him the dick">>
-- 
GitLab