From eb92be13c2831c043501b43ecd2a01b49e4bd2ef Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Thu, 18 Aug 2022 15:10:04 +0900
Subject: [PATCH 01/29] whoring career mod

---
 src/endWeek/economics/persBusiness.js | 65 ++++++++++++++++++---------
 1 file changed, 43 insertions(+), 22 deletions(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index 50dbd9cff67..47f7fe19056 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -75,13 +75,13 @@ App.EndWeek.personalBusiness = function() {
 		income = random(2000, 4500);
 		if (V.PC.belly >= 1500) {
 			if (V.arcologies[0].FSRepopulationFocus !== "unset") {
-				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc((income * (V.rep / 500)) + (V.PC.belly)))}</span> for your body, much more than usual; you guess your pregnancy-focused population wants your baby-rounded body more than ever. However, doing such things <span class="red">damages your reputation.</span>`);
+				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc((income * (V.rep / 500)) + (V.PC.belly)))}</span> for your body, much more than usual; you guess your pregnancy-focused population wants your baby-rounded body more than ever. Doing your part <span class="green">improves your reputation.</span>`);
 				cashX(Math.trunc((income * (V.rep / 500)) + (V.PC.belly)), "personalBusiness");
-				repX((V.rep * .95) - V.rep, "personalBusiness");
+				repX(400, "personalBusiness");
 			} else if (V.arcologies[0].FSRepopulationFocusPregPolicy === 1) {
-				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc((income * (V.rep / 500)) + (V.PC.belly / 2)))}</span> for your body, more than usual; but that's to be expected, after all, pregnancy is trendy right now. Event still, doing such things <span class="red">damages your reputation.</span>`);
+				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc((income * (V.rep / 500)) + (V.PC.belly / 2)))}</span> for your body, more than usual; but that's to be expected, after all, pregnancy is trendy right now. Doing your part <span class="green">improves your reputation.</span>`);
 				cashX(Math.trunc((income * (V.rep / 500)) + (V.PC.belly / 2)), "personalBusiness");
-				repX((V.rep * .95) - V.rep, "personalBusiness");
+				repX(200, "personalBusiness");
 			} else if (V.arcologies[0].FSRestart !== "unset") {
 				if (V.PC.pregSource !== -1 && V.PC.pregSource !== -6) {
 					r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(25)},</span> barely enough to cover the abortion the john that gave it to you told you to get. Showing off your gravid body <span class="red">infuriates your citizens and cripples your reputation.</span>`);
@@ -90,39 +90,60 @@ App.EndWeek.personalBusiness = function() {
 					if (V.eugenicsFullControl !== 1) {
 						V.failedElite += 25;
 					}
+					V.enduringRep *= .9;
 				} else {
-					r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 500)))}</span> for your body. However, doing such things <span class="red">damages your reputation.</span>`);
-					cashX(Math.trunc(income * (V.rep / 500)), "personalBusiness");
-					repX((V.rep * .9) - V.rep, "personalBusiness");
+					r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 300)))}</span> for your body. Showing off the womb claimed by the elites placates the council, making them forgive some past transgressions`);
+					cashX(Math.trunc(income * (V.rep / 300)), "personalBusiness");
+					if (V.eugenicsFullControl !== 1) {
+						V.failedElite -= 25;
+					}
 				}
 			} else {
 				income = random(5, 2500);
 				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 800)))}</span> for your body, much less than usual; your pregnancy must be turning off potential clients. However, doing such things <span class="red">damages your reputation.</span>`);
 				cashX(Math.trunc(income * (V.rep / 800)), "personalBusiness");
 				repX((V.rep * .9) - V.rep, "personalBusiness");
+				V.enduringRep *= .9;
 			}
 		} else {
-			r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 500)))}</span> for your body. However, doing such things <span class="red">damages your reputation.</span>`);
-			cashX(Math.trunc(income * (V.rep / 500)), "personalBusiness");
-			repX((V.rep * .9) - V.rep, "personalBusiness");
+			if (V.rep < 3000) {
+				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 500)))}</span> for your body. You being unknown helps you <span class="yellow">stay under the radar.</span>`);
+				cashX(Math.trunc(income * (V.rep / 500)), "personalBusiness");
+			} else {
+				if (V.rep > 10000) {
+					r.push(`You focus on entertaining the cream of society this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 300)))}</span> for your body. Doing such things <span class="green">improves your reputation.</span>`);
+					cashX(Math.trunc(income * (V.rep / 300)), "personalBusiness");
+					repX(V.rep * 0.05, "personalBusiness");
+				} else {
+					r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 500)))}</span> for your body. Doing such things <span class="green">improves your reputation.</span>`);
+					cashX(Math.trunc(income * (V.rep / 500)), "personalBusiness");
+					repX(200, "personalBusiness");
+				}
+
+			}
 			if (canGetPregnant(V.PC)) {
-				if (V.arcologies[0].FSRepopulationFocus !== "unset" && random(1, 100) > 80) {
-					r.push(`A horny client offered you an extra <span class="yellowgreen">${cashFormat(1000)}</span> for downing some fertility drugs. You're already forgoing birth control, so what harm could an extra baby do?`);
-					cashX(1000, "personalBusiness");
-					V.PC.forcedFertDrugs += 2;
-				} else if (random(1, 100) > 90) {
-					if (V.PC.skill.medicine >= 25) {
-						r.push(`Your client this week tried to trick you into taking fertility supplements disguised as party drugs. You still took them, of course, but made sure he <span class="yellowgreen">paid extra</span> for the privilege.`);
+				if (V.arcologies[0].FSRestart !== "unset") {
+					r.push(`You make sure your client is of the correct pedigree, so even though you aren't on birth control at least the resulting baby is approved by the elites.`);
+					r.push(knockMeUp(V.PC, 20, 0, -6));
+				} else {
+					if (V.arcologies[0].FSRepopulationFocus !== "unset" && random(1, 100) > 80) {
+						r.push(`A horny client offered you an extra <span class="yellowgreen">${cashFormat(1000)}</span> for downing some fertility drugs. You're already forgoing birth control, so what harm could an extra baby do?`);
 						cashX(1000, "personalBusiness");
-					} else {
-						r.push(`Your client this week offered you some free pills to make sex more fun. He was right; it made bareback sex feel amazing.`);
+						V.PC.forcedFertDrugs += 2;
+					} else if (random(1, 100) > 90) {
+						if (V.PC.skill.medicine >= 25) {
+							r.push(`Your client this week tried to trick you into taking fertility supplements disguised as party drugs. You still took them, of course, but made sure he <span class="yellowgreen">paid extra</span> for the privilege.`);
+							cashX(1000, "personalBusiness");
+						} else {
+							r.push(`Your client this week offered you some free pills to make sex more fun. He was right; it made bareback sex feel amazing.`);
+						}
+						V.PC.forcedFertDrugs += 2;
 					}
-					V.PC.forcedFertDrugs += 2;
+					r.push(knockMeUp(V.PC, 20, 0, -5));
 				}
-				r.push(knockMeUp(V.PC, 20, 0, -5));
+
 			}
 		}
-		V.enduringRep *= .5;
 	} else if (V.personalAttention.task === PersonalAttention.MAID) {
 		if (V.PC.belly >= 5000) {
 			r.push(`You spend your free time hustling around your penthouse, cleaning and making sure everything is in order. You manage to reduce your upkeep by 20%. Your`);
-- 
GitLab


From 3c7b6eb1a007e7990c894c92845aaf397f363649 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Thu, 18 Aug 2022 16:27:20 +0900
Subject: [PATCH 02/29] custom mods

---
 src/endWeek/economics/persBusiness.js |  9 +++-
 src/events/nonRandom/pRaped.js        | 76 +++++++++++++++++++++------
 2 files changed, 67 insertions(+), 18 deletions(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index 47f7fe19056..0def6d468b3 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -13,6 +13,12 @@ App.EndWeek.personalBusiness = function() {
 	let catchTChance;
 	let upgradeCount;
 	let dataGain;
+	function getWhoringClient() {
+		let c = `You arive at the apartment of your client, one of the millionaires of your arcology. You greet him with a kiss and turn up your charm. Having dinner at a fancy restaurant, you hang on to his arms and play the role of escort perfectly. Perhaps too well, as soon he drags you into the bathroom for a quick session. You work your hips into his as he fucks you over the sink. Soon you leave the restaurant with more than just fancy food filling your belly.`;
+			
+		return c;
+	}
+	
 	if (V.useTabs === 0) {
 		App.UI.DOM.appendNewElement("h2", el, `Personal Business`);
 	}
@@ -141,9 +147,10 @@ App.EndWeek.personalBusiness = function() {
 					}
 					r.push(knockMeUp(V.PC, 20, 0, -5));
 				}
-
 			}
+			
 		}
+		r.push(getWhoringClient());
 	} else if (V.personalAttention.task === PersonalAttention.MAID) {
 		if (V.PC.belly >= 5000) {
 			r.push(`You spend your free time hustling around your penthouse, cleaning and making sure everything is in order. You manage to reduce your upkeep by 20%. Your`);
diff --git a/src/events/nonRandom/pRaped.js b/src/events/nonRandom/pRaped.js
index 9944294ed02..258b0dc9422 100644
--- a/src/events/nonRandom/pRaped.js
+++ b/src/events/nonRandom/pRaped.js
@@ -5,12 +5,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 
 	eventPrerequisites() {
 		return [
-			() => App.Events.effectiveWeek() === 12,
-			() => V.raped === -1,
-			() => V.arcologyUpgrade.drones !== 1,
-			() => V.BodyguardID === 0,
 			() => V.PC.career !== "arcology owner",
-			() => V.PC.visualAge >= 14
 		];
 	}
 
@@ -19,8 +14,6 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 		const {
 			hisP, womanP, girlP
 		} = getPronouns(V.PC).appendSuffix("P");
-		V.raped = 1;
-
 		const genParam = {minAge: 16, race: "nonslave", disableDisability: 1};
 		let rapist;
 		const contractCost = 1000;
@@ -41,6 +34,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 			rapist.waist = -20;
 		}
 		rapist.muscles = Math.max(rapist.muscles, 10);
+		rapist.height = 180;
 		rapist.origin = `You sentenced $him to enslavement for the attempted rape of a free ${womanP} - you, to be exact.`;
 		rapist.devotion = -100;
 		rapist.trust = -100;
@@ -61,25 +55,37 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 			r.push(`The moment you hear the sound of the knife unsheathe your reflexes take`);
 			if (!isHindered(V.PC)) {
 				r.push(`over. With a single strike, the ${woman} tailing you lies in a heap on the ground.`);
-				V.raped = 0;
 			} else {
 				r.push(`over, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`);
+				if ( V.BodyguardID !== 0 ) {
+					r.push(`Luckily your bodyguard ${S.Bodyguard.slaveName} is not far behind, and has already positioned to save you. With a quick strike the would be rapist is stopped.`);
+				} else {
+					V.raped += 1;
+				}
 			}
 		} else if (isPCCareerInCategory("slaver") || V.PC.skill.warfare >= 45) {
 			r.push(`The moment you notice an arm coming around from behind you, your training kicks in.`);
 			if (!isHindered(V.PC)) {
 				r.push(`You quickly disarm the assailant and knock them to the floor before placing them in a choke-hold. Once they are subdued, you stand back to decide what to do next.`);
-				V.raped = 0;
 			} else {
 				r.push(`You quickly try to disarm your assailant, but find your body has become a bit too ponderous as of late. After a short struggle, it is you that ends up pinned with a knife to the throat.`);
+				if ( V.BodyguardID !== 0 ) {
+					r.push(`Luckily your bodyguard ${S.Bodyguard.slaveName} is not far behind, and has already positioned to save you. With a quick strike the would be rapist is stopped.`);
+				} else {
+					V.raped += 1;
+				}
 			}
 		} else if (isPCCareerInCategory("gang")) {
 			r.push(`The moment you hear the sound of the knife unsheathe your reflexes take over.`);
 			if (!isHindered(V.PC)) {
 				r.push(`With a single stab, your own shiv is buried in ${his} chest, incapacitating ${him}.`);
-				V.raped = 0;
 			} else {
 				r.push(`You try to draw your shiv and stab ${him}, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`);
+				if ( V.BodyguardID !== 0 ) {
+					r.push(`Luckily your bodyguard ${S.Bodyguard.slaveName} is not far behind, and has already positioned to save you. With a quick strike the would be rapist is stopped.`);
+				} else {
+					V.raped += 1;
+				}
 			}
 		} else {
 			r.push(`You stifle a`);
@@ -89,19 +95,35 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 				r.push(`scream`);
 			}
 			r.push(`when you feel your arm grabbed and the knife pressed to your throat, knowing that it will only end badly for you in this place.`);
+			if ( V.BodyguardID !== 0 ) {
+				r.push(`Luckily your bodyguard ${S.Bodyguard.slaveName} is not far behind, and has already positioned to save you. With a quick strike the would be rapist is stopped.`);
+			} else {
+				V.raped += 1;
+			}
 		}
 		App.Events.addParagraph(node, r);
-		if (V.raped === 1) {
-			r = [];
-			V.fcnn.push("...plans for increased security measures, but refused to answer questions regarding...");
-			if (V.PC.vagina >= 0) {
-				r.push(Spoken(rapist, `"Well, well, well, look what ${(V.PC.belly >= 5000 || V.PC.preg >= 20 || V.PC.weight >= 130) ? `waddled` : `walked`} into my territory. If it isn't ${V.PC.slaveName}, come to grace me with ${hisP} presence."`));
+		if (V.raped >= 1 && V.BodyguardID === 0) {
+			if (V.raped === 1) {
+				V.fcnn.push("...plans for increased security measures, but refused to answer questions regarding...");
+				if (V.PC.vagina >= 0) {
+					r.push(Spoken(rapist, `"Well, well, well, look what ${(V.PC.belly >= 5000 || V.PC.preg >= 20 || V.PC.weight >= 130) ? `waddled` : `walked`} into my territory. If it isn't ${V.PC.slaveName}, come to grace me with ${hisP} presence."`));
+				} else {
+					r.push(Spoken(rapist, `"I've been watching you ever since you first moved in, ${V.PC.slaveName}, waiting for the perfect moment to make you mine. We are going to have a little fun, you and I."`));
+				}
 			} else {
-				r.push(Spoken(rapist, `"I've been watching you ever since you first moved in, ${V.PC.slaveName}, waiting for the perfect moment to make you mine. We are going to have a little fun, you and I."`));
+				V.fcnn.push("...though denying the possibility, the lack of actual potential partners makes for little info...");
+				if (V.PC.vagina >= 0) {
+					r.push(Spoken(rapist, `"Back again? If it isn't ${V.PC.slaveName}, come to grace me with ${hisP} presence."`));
+				} else {
+					r.push(Spoken(rapist, `"I've heard that you've undone the damage. It brings a tear to my eye that you're letting me break you in again."`));
+				}
 			}
+			
+			r = [];
+			
 			r.push(`The ${woman} binds your hands behind you, all the while keeping the knife to your throat.`);
 			r.push(Spoken(rapist, `"Smart keeping your mouth shut; maybe I won't have to hurt you. Heh, I know what you're thinking, that you'll find out who I am and punish me. Don't worry, I made sure to not to leave you any trails to follow${V.PC.visualAge < V.minimumSlaveAge ? ", especially with you being so sinfully delectable" : ""}. Now let's see what we have here."`));
-
+			
 			if (V.PC.vagina >= 0) {
 				if (V.PC.butt > 4) {
 					r.push(Spoken(rapist, `"God, the way your fat ass is hugging my dick, you were just made to be bent over, weren't you?"`));
@@ -118,6 +140,22 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 					r.push(Spoken(rapist, `"Nothing wrong with carrying a little extra weight,"`));
 					r.push(`${he} teases as ${he} grinds against your soft form.`);
 				}
+				
+				r.push(`${his} hands roaming your entire body, he takes note of your height compared to his.`);
+				if (PC.height <= rapist.height - 30) {
+					r.push(Spoken(rapist, `"You make for a good little fuck nugget."`));
+					r.push(`${he} says as ${he} lifts you up.`);
+				} else if (PC.height <= rapist.height)) {
+					r.push(Spoken(rapist, `"How'd a shorty like you get into such a high position?"`));
+					r.push(`${he} says as ${he} manhandles you.`);
+				} else if (PC.height >= rapist.height + 30) {
+					r.push(Spoken(rapist, `"I can't wait to dominate you and bring you to the floor"`));
+					r.push(`${he} says as ${he} forces you to kneel.`);
+				} else if (PC.height >= rapist.height)) {
+					r.push(Spoken(rapist, `"That height won't help you when you're bouncing on my dick."`));
+					r.push(`${he} says as ${he} forces you to bend down.`);
+				}
+				
 				if (isPCCareerInCategory("wealth")) {
 					if (V.PC.boobs >= 300) {
 						r.push(Spoken(rapist, `"Nice and supple. How much did you have to pay for these babies?"`));
@@ -228,6 +266,10 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 						r.push(Spoken(rapist, `"So, did you ever get to use this when you were a prostitute?"`));
 						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
 					}
+					if (V.PC.visualAge < 16) {
+						r.push(Spoken(rapist, `"How many rich bastards did you serve with your tight cunny before this?"`));
+						r.push(`${he} laughs ${he} fingers your youthful hole.`);
+					}
 				} else if (isPCCareerInCategory("gang")) {
 					if (V.PC.boobs >= 300) {
 						r.push(Spoken(rapist, `"I bet I'm not the first person to do this to you, am I?"`));
-- 
GitLab


From 7c8a3a0fb6f088aeabba862dcf9fef5a45e069d7 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Thu, 18 Aug 2022 17:05:52 +0900
Subject: [PATCH 03/29] experimental tweak

---
 src/endWeek/economics/persBusiness.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index 0def6d468b3..2b777fa2150 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -14,7 +14,7 @@ App.EndWeek.personalBusiness = function() {
 	let upgradeCount;
 	let dataGain;
 	function getWhoringClient() {
-		let c = `You arive at the apartment of your client, one of the millionaires of your arcology. You greet him with a kiss and turn up your charm. Having dinner at a fancy restaurant, you hang on to his arms and play the role of escort perfectly. Perhaps too well, as soon he drags you into the bathroom for a quick session. You work your hips into his as he fucks you over the sink. Soon you leave the restaurant with more than just fancy food filling your belly.`;
+		let c = `You arive at the apartment of your client, one of the millionaires of your arcology. You greet him with a kiss and turn up your charm. Having dinner at a fancy restaurant, you hang on to his arms and play the role of escort perfectly. Perhaps too well, as soon he drags you into the bathroom for a quick session. You work your hips into his as he fucks you over the sink. Soon you leave the restaurant with more than just fancy food filling your belly. However the date is not over, as he continues filling your other holes in the car.`;
 			
 		return c;
 	}
-- 
GitLab


From f8ad0ae3601837c0d2576827b5e70d6b21e29eba Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Thu, 18 Aug 2022 19:59:46 +0900
Subject: [PATCH 04/29] Fix code errors

---
 src/endWeek/economics/persBusiness.js | 1 -
 src/events/nonRandom/pRaped.js        | 4 ++--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index 2b777fa2150..492eba5199d 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -15,7 +15,6 @@ App.EndWeek.personalBusiness = function() {
 	let dataGain;
 	function getWhoringClient() {
 		let c = `You arive at the apartment of your client, one of the millionaires of your arcology. You greet him with a kiss and turn up your charm. Having dinner at a fancy restaurant, you hang on to his arms and play the role of escort perfectly. Perhaps too well, as soon he drags you into the bathroom for a quick session. You work your hips into his as he fucks you over the sink. Soon you leave the restaurant with more than just fancy food filling your belly. However the date is not over, as he continues filling your other holes in the car.`;
-			
 		return c;
 	}
 	
diff --git a/src/events/nonRandom/pRaped.js b/src/events/nonRandom/pRaped.js
index 258b0dc9422..3f6502b9962 100644
--- a/src/events/nonRandom/pRaped.js
+++ b/src/events/nonRandom/pRaped.js
@@ -145,13 +145,13 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 				if (PC.height <= rapist.height - 30) {
 					r.push(Spoken(rapist, `"You make for a good little fuck nugget."`));
 					r.push(`${he} says as ${he} lifts you up.`);
-				} else if (PC.height <= rapist.height)) {
+				} else if (PC.height <= rapist.height) {
 					r.push(Spoken(rapist, `"How'd a shorty like you get into such a high position?"`));
 					r.push(`${he} says as ${he} manhandles you.`);
 				} else if (PC.height >= rapist.height + 30) {
 					r.push(Spoken(rapist, `"I can't wait to dominate you and bring you to the floor"`));
 					r.push(`${he} says as ${he} forces you to kneel.`);
-				} else if (PC.height >= rapist.height)) {
+				} else if (PC.height >= rapist.height) {
 					r.push(Spoken(rapist, `"That height won't help you when you're bouncing on my dick."`));
 					r.push(`${he} says as ${he} forces you to bend down.`);
 				}
-- 
GitLab


From e9b40364fc19866a53c382a8811e525e8242e92a Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Thu, 18 Aug 2022 23:00:24 +0900
Subject: [PATCH 05/29] reworked rape event, degeneracy penalties and
 forgiveness for whoring

---
 src/endWeek/economics/persBusiness.js |   4 +
 src/events/nonRandom/pRaped.js        | 122 ++++++++++++++++----------
 2 files changed, 78 insertions(+), 48 deletions(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index 492eba5199d..c428b695819 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -102,6 +102,10 @@ App.EndWeek.personalBusiness = function() {
 					if (V.eugenicsFullControl !== 1) {
 						V.failedElite -= 25;
 					}
+					if (V.PC.degeneracy > 1) {
+						V.PC.degeneracy -= 1;
+					}
+					
 				}
 			} else {
 				income = random(5, 2500);
diff --git a/src/events/nonRandom/pRaped.js b/src/events/nonRandom/pRaped.js
index 3f6502b9962..2a55d83b93b 100644
--- a/src/events/nonRandom/pRaped.js
+++ b/src/events/nonRandom/pRaped.js
@@ -6,6 +6,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
 			() => V.PC.career !== "arcology owner",
+			() => random(0, 5) === 3
 		];
 	}
 
@@ -48,77 +49,102 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 			his, he, him, himself, woman
 		} = getPronouns(rapist);
 		const {say} = getEnunciation(rapist);
-
-		r.push(`While returning from a meeting with a prospective investor, an unfortunate wrong turn has led you into a rather seedy area of your arcology. You feel distinctly uncomfortable for some reason.`);
-
-		if (isPCCareerInCategory("mercenary") || V.PC.skill.warfare >= 85) {
-			r.push(`The moment you hear the sound of the knife unsheathe your reflexes take`);
-			if (!isHindered(V.PC)) {
-				r.push(`over. With a single strike, the ${woman} tailing you lies in a heap on the ground.`);
+		V.raped = 1;
+		if (V.rapedTimes > 5) {
+			r.push(`While returning from a meeting with a prospective investor, a purposeful wrong turn has led you into a rather seedy area of your arcology. You feel a rush of lust for some reason. You've already stripped off your clothes, baring your ${(V.PC.belly >= 5000 || V.PC.preg >= 20) ? `swollen belly` : `naked body` to the dark alleyways.`);
+			if (V.PC.pregSource === -4) {
+				r.push(`You proudly show off the mark the rapists have left on your body, gently cradling where the rape baby is growing.`);
+			}
+			if (V.BodyguardID !== 0 ) {
+				r.push(`Your bodyguard goes on edge, confused and oblivious to your lust. When a hand reaches out from the shadows, your bodyguard moves to attack but is stopped by your command. You saunter over to the hand, letting the ${woman} run ${his} hands over you like the tamed slut you are. Your bodyguard agonizes over this disruption of ${his} protection of your person, <span class="devotion dec">confused and unhappy,</span> but stands down as requested.`);
+				S.Bodyguard.devotion -= 5;
 			} else {
-				r.push(`over, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`);
-				if ( V.BodyguardID !== 0 ) {
-					r.push(`Luckily your bodyguard ${S.Bodyguard.slaveName} is not far behind, and has already positioned to save you. With a quick strike the would be rapist is stopped.`);
+				r.push(`When a hand reaches out from the shadows, you saunter over, letting the ${woman} run ${his} hands over you like the tamed slut you are.`);
+			}
+			r.push(`A crowd has formed, as if anticipating your visit. You know your place, and unresistingly let them lift you up. Your pussy is glistening as the first of many dick enters you. With so many dicks to service, you barely have any time to focus on the pleasure as you work your hands, mouth, feet and hips to satisfy the crowd.`);
+			
+			if (canGetPregnant(V.PC)) {
+				r.push(`Your cervix is pounded raw. Each participant makes sure to only cum when hilted inside you, and your toes curl as you feel your belly swells with a volatile mix of cum. Your womb becomes a battlefield as the gangbang sperm fight to be the first to fertilize you.`);
+				knockMeUp(V.PC, 100, 0, -4);
+			}
+			r.push(`By the time the gangbang ends, you are left bloated with cum on the floor. The only thought in your mind being when you can come back and do this again. <span class="red">Rumors of the arcology owner being a rape slut spreads around.</span>`);
+			repX((V.rep * .9) - V.rep, "PCactions");
+			V.PC.degeneracy += 10;
+			V.raped = 0
+			V.rapedTimes++;
+			App.Events.addParagraph(node, r);
+		} else {
+			r.push(`While returning from a meeting with a prospective investor, an unfortunate wrong turn has led you into a rather seedy area of your arcology. You feel distinctly uncomfortable for some reason.`);
+			if (isPCCareerInCategory("mercenary") || V.PC.skill.warfare >= 85) {
+				r.push(`The moment you hear the sound of the knife unsheathe your reflexes take`);
+				if (!isHindered(V.PC)) {
+					r.push(`over. With a single strike, the ${woman} tailing you lies in a heap on the ground.`);
 				} else {
-					V.raped += 1;
+					r.push(`over, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`);
+					if ( V.BodyguardID !== 0 ) {
+						r.push(`Luckily your bodyguard ${S.Bodyguard.slaveName} is not far behind, and has already positioned to save you. With a quick strike the would be rapist is stopped.`);
+						V.raped = 0;
+					}
 				}
-			}
-		} else if (isPCCareerInCategory("slaver") || V.PC.skill.warfare >= 45) {
-			r.push(`The moment you notice an arm coming around from behind you, your training kicks in.`);
-			if (!isHindered(V.PC)) {
-				r.push(`You quickly disarm the assailant and knock them to the floor before placing them in a choke-hold. Once they are subdued, you stand back to decide what to do next.`);
-			} else {
-				r.push(`You quickly try to disarm your assailant, but find your body has become a bit too ponderous as of late. After a short struggle, it is you that ends up pinned with a knife to the throat.`);
-				if ( V.BodyguardID !== 0 ) {
-					r.push(`Luckily your bodyguard ${S.Bodyguard.slaveName} is not far behind, and has already positioned to save you. With a quick strike the would be rapist is stopped.`);
+			} else if (isPCCareerInCategory("slaver") || V.PC.skill.warfare >= 45) {
+				r.push(`The moment you notice an arm coming around from behind you, your training kicks in.`);
+				if (!isHindered(V.PC)) {
+					r.push(`You quickly disarm the assailant and knock them to the floor before placing them in a choke-hold. Once they are subdued, you stand back to decide what to do next.`);
 				} else {
-					V.raped += 1;
+					r.push(`You quickly try to disarm your assailant, but find your body has become a bit too ponderous as of late. After a short struggle, it is you that ends up pinned with a knife to the throat.`);
+					if ( V.BodyguardID !== 0 ) {
+						r.push(`Luckily your bodyguard ${S.Bodyguard.slaveName} is not far behind, and has already positioned to save you. With a quick strike the would be rapist is stopped.`);
+						V.raped = 0;
+					}
+				}
+			} else if (isPCCareerInCategory("gang")) {
+				r.push(`The moment you hear the sound of the knife unsheathe your reflexes take over.`);
+				if (!isHindered(V.PC)) {
+					r.push(`With a single stab, your own shiv is buried in ${his} chest, incapacitating ${him}.`);
+				} else {
+					r.push(`You try to draw your shiv and stab ${him}, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`);
+					if ( V.BodyguardID !== 0 ) {
+						r.push(`Luckily your bodyguard ${S.Bodyguard.slaveName} is not far behind, and has already positioned to save you. With a quick strike the would be rapist is stopped.`);
+						V.raped = 0;
+					}
 				}
-			}
-		} else if (isPCCareerInCategory("gang")) {
-			r.push(`The moment you hear the sound of the knife unsheathe your reflexes take over.`);
-			if (!isHindered(V.PC)) {
-				r.push(`With a single stab, your own shiv is buried in ${his} chest, incapacitating ${him}.`);
 			} else {
-				r.push(`You try to draw your shiv and stab ${him}, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`);
+				r.push(`You stifle a`);
+				if (V.PC.title === 1) {
+					r.push(`swear`);
+				} else {
+					r.push(`scream`);
+				}
+				r.push(`when you feel your arm grabbed and the knife pressed to your throat, knowing that it will only end badly for you in this place.`);
 				if ( V.BodyguardID !== 0 ) {
 					r.push(`Luckily your bodyguard ${S.Bodyguard.slaveName} is not far behind, and has already positioned to save you. With a quick strike the would be rapist is stopped.`);
-				} else {
-					V.raped += 1;
+					V.raped = 0;
 				}
 			}
-		} else {
-			r.push(`You stifle a`);
-			if (V.PC.title === 1) {
-				r.push(`swear`);
-			} else {
-				r.push(`scream`);
-			}
-			r.push(`when you feel your arm grabbed and the knife pressed to your throat, knowing that it will only end badly for you in this place.`);
-			if ( V.BodyguardID !== 0 ) {
-				r.push(`Luckily your bodyguard ${S.Bodyguard.slaveName} is not far behind, and has already positioned to save you. With a quick strike the would be rapist is stopped.`);
-			} else {
-				V.raped += 1;
-			}
 		}
+
+
 		App.Events.addParagraph(node, r);
-		if (V.raped >= 1 && V.BodyguardID === 0) {
-			if (V.raped === 1) {
+		if (V.raped === 1) {
+			if (V.rapedTimes !== 1) {
 				V.fcnn.push("...plans for increased security measures, but refused to answer questions regarding...");
 				if (V.PC.vagina >= 0) {
 					r.push(Spoken(rapist, `"Well, well, well, look what ${(V.PC.belly >= 5000 || V.PC.preg >= 20 || V.PC.weight >= 130) ? `waddled` : `walked`} into my territory. If it isn't ${V.PC.slaveName}, come to grace me with ${hisP} presence."`));
 				} else {
 					r.push(Spoken(rapist, `"I've been watching you ever since you first moved in, ${V.PC.slaveName}, waiting for the perfect moment to make you mine. We are going to have a little fun, you and I."`));
 				}
+				V.rapedTimes = 1;
 			} else {
-				V.fcnn.push("...though denying the possibility, the lack of actual potential partners makes for little info...");
-				if (V.PC.vagina >= 0) {
+				V.fcnn.push("...though denying the possibility, the torn clothing points to...");
+				if (V.PC.vagina > 0) {
 					r.push(Spoken(rapist, `"Back again? If it isn't ${V.PC.slaveName}, come to grace me with ${hisP} presence."`));
-				} else {
+				} else if (V.PC.vagina === 0){
 					r.push(Spoken(rapist, `"I've heard that you've undone the damage. It brings a tear to my eye that you're letting me break you in again."`));
+				} else {
+					
 				}
 			}
-			
+			V.rapedTimes++;
 			r = [];
 			
 			r.push(`The ${woman} binds your hands behind you, all the while keeping the knife to your throat.`);
-- 
GitLab


From 980ca127af9611be2d0426451d15f882ea85bec7 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Thu, 18 Aug 2022 23:08:30 +0900
Subject: [PATCH 06/29] fix missing parenth

---
 src/events/nonRandom/pRaped.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/events/nonRandom/pRaped.js b/src/events/nonRandom/pRaped.js
index 2a55d83b93b..4964cda6bdb 100644
--- a/src/events/nonRandom/pRaped.js
+++ b/src/events/nonRandom/pRaped.js
@@ -51,7 +51,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 		const {say} = getEnunciation(rapist);
 		V.raped = 1;
 		if (V.rapedTimes > 5) {
-			r.push(`While returning from a meeting with a prospective investor, a purposeful wrong turn has led you into a rather seedy area of your arcology. You feel a rush of lust for some reason. You've already stripped off your clothes, baring your ${(V.PC.belly >= 5000 || V.PC.preg >= 20) ? `swollen belly` : `naked body` to the dark alleyways.`);
+			r.push(`While returning from a meeting with a prospective investor, a purposeful wrong turn has led you into a rather seedy area of your arcology. You feel a rush of lust for some reason. You've already stripped off your clothes, baring your ${(V.PC.belly >= 5000 || V.PC.preg >= 20) ? `swollen belly` : `naked body`} to the dark alleyways.`);
 			if (V.PC.pregSource === -4) {
 				r.push(`You proudly show off the mark the rapists have left on your body, gently cradling where the rape baby is growing.`);
 			}
@@ -70,7 +70,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 			r.push(`By the time the gangbang ends, you are left bloated with cum on the floor. The only thought in your mind being when you can come back and do this again. <span class="red">Rumors of the arcology owner being a rape slut spreads around.</span>`);
 			repX((V.rep * .9) - V.rep, "PCactions");
 			V.PC.degeneracy += 10;
-			V.raped = 0
+			V.raped = 0;
 			V.rapedTimes++;
 			App.Events.addParagraph(node, r);
 		} else {
-- 
GitLab


From 2046b2d5eb8c984c91f6814c885f0ca05cacc755 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Thu, 18 Aug 2022 23:44:41 +0900
Subject: [PATCH 07/29] misused variables

---
 src/events/nonRandom/pRaped.js | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/src/events/nonRandom/pRaped.js b/src/events/nonRandom/pRaped.js
index 4964cda6bdb..d7a450183d9 100644
--- a/src/events/nonRandom/pRaped.js
+++ b/src/events/nonRandom/pRaped.js
@@ -57,7 +57,6 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 			}
 			if (V.BodyguardID !== 0 ) {
 				r.push(`Your bodyguard goes on edge, confused and oblivious to your lust. When a hand reaches out from the shadows, your bodyguard moves to attack but is stopped by your command. You saunter over to the hand, letting the ${woman} run ${his} hands over you like the tamed slut you are. Your bodyguard agonizes over this disruption of ${his} protection of your person, <span class="devotion dec">confused and unhappy,</span> but stands down as requested.`);
-				S.Bodyguard.devotion -= 5;
 			} else {
 				r.push(`When a hand reaches out from the shadows, you saunter over, letting the ${woman} run ${his} hands over you like the tamed slut you are.`);
 			}
@@ -126,6 +125,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 
 		App.Events.addParagraph(node, r);
 		if (V.raped === 1) {
+			r = [];
 			if (V.rapedTimes !== 1) {
 				V.fcnn.push("...plans for increased security measures, but refused to answer questions regarding...");
 				if (V.PC.vagina >= 0) {
@@ -140,12 +140,9 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 					r.push(Spoken(rapist, `"Back again? If it isn't ${V.PC.slaveName}, come to grace me with ${hisP} presence."`));
 				} else if (V.PC.vagina === 0){
 					r.push(Spoken(rapist, `"I've heard that you've undone the damage. It brings a tear to my eye that you're letting me break you in again."`));
-				} else {
-					
-				}
+				} 
 			}
 			V.rapedTimes++;
-			r = [];
 			
 			r.push(`The ${woman} binds your hands behind you, all the while keeping the knife to your throat.`);
 			r.push(Spoken(rapist, `"Smart keeping your mouth shut; maybe I won't have to hurt you. Heh, I know what you're thinking, that you'll find out who I am and punish me. Don't worry, I made sure to not to leave you any trails to follow${V.PC.visualAge < V.minimumSlaveAge ? ", especially with you being so sinfully delectable" : ""}. Now let's see what we have here."`));
@@ -168,16 +165,16 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 				}
 				
 				r.push(`${his} hands roaming your entire body, he takes note of your height compared to his.`);
-				if (PC.height <= rapist.height - 30) {
+				if (V.PC.height <= rapist.height - 30) {
 					r.push(Spoken(rapist, `"You make for a good little fuck nugget."`));
 					r.push(`${he} says as ${he} lifts you up.`);
-				} else if (PC.height <= rapist.height) {
+				} else if (V.PC.height <= rapist.height) {
 					r.push(Spoken(rapist, `"How'd a shorty like you get into such a high position?"`));
 					r.push(`${he} says as ${he} manhandles you.`);
-				} else if (PC.height >= rapist.height + 30) {
+				} else if (V.PC.height >= rapist.height + 30) {
 					r.push(Spoken(rapist, `"I can't wait to dominate you and bring you to the floor"`));
 					r.push(`${he} says as ${he} forces you to kneel.`);
-				} else if (PC.height >= rapist.height) {
+				} else if (V.PC.height >= rapist.height) {
 					r.push(Spoken(rapist, `"That height won't help you when you're bouncing on my dick."`));
 					r.push(`${he} says as ${he} forces you to bend down.`);
 				}
-- 
GitLab


From 3aeefc6608751721e57634e6a62548156f849cf8 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Fri, 19 Aug 2022 02:57:21 +0900
Subject: [PATCH 08/29] fixes

---
 src/events/nonRandom/pRaped.js | 46 +++++++++++++++++++++++-----------
 1 file changed, 32 insertions(+), 14 deletions(-)

diff --git a/src/events/nonRandom/pRaped.js b/src/events/nonRandom/pRaped.js
index d7a450183d9..45fbfc96d91 100644
--- a/src/events/nonRandom/pRaped.js
+++ b/src/events/nonRandom/pRaped.js
@@ -6,7 +6,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
 			() => V.PC.career !== "arcology owner",
-			() => random(0, 5) === 3
+			() => random(0, 8) === 8
 		];
 	}
 
@@ -55,23 +55,41 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 			if (V.PC.pregSource === -4) {
 				r.push(`You proudly show off the mark the rapists have left on your body, gently cradling where the rape baby is growing.`);
 			}
-			if (V.BodyguardID !== 0 ) {
+			if (V.BodyguardID !== 0) {
 				r.push(`Your bodyguard goes on edge, confused and oblivious to your lust. When a hand reaches out from the shadows, your bodyguard moves to attack but is stopped by your command. You saunter over to the hand, letting the ${woman} run ${his} hands over you like the tamed slut you are. Your bodyguard agonizes over this disruption of ${his} protection of your person, <span class="devotion dec">confused and unhappy,</span> but stands down as requested.`);
 			} else {
 				r.push(`When a hand reaches out from the shadows, you saunter over, letting the ${woman} run ${his} hands over you like the tamed slut you are.`);
 			}
-			r.push(`A crowd has formed, as if anticipating your visit. You know your place, and unresistingly let them lift you up. Your pussy is glistening as the first of many dick enters you. With so many dicks to service, you barely have any time to focus on the pleasure as you work your hands, mouth, feet and hips to satisfy the crowd.`);
-			
+			r.push(`A crowd has formed, as if anticipating your visit. You know your place, and are unresistant when they lift you up. Your pussy is glistening as the first of many dick enters you. With so many dicks to service, you barely have any time to focus on the pleasure as you work your hands, mouth, feet and hips to satisfy the crowd. You are passed around like a toy, used only for their pleasure.`);
+			App.Events.addParagraph(node, r);
+			r = [];
 			if (canGetPregnant(V.PC)) {
 				r.push(`Your cervix is pounded raw. Each participant makes sure to only cum when hilted inside you, and your toes curl as you feel your belly swells with a volatile mix of cum. Your womb becomes a battlefield as the gangbang sperm fight to be the first to fertilize you.`);
 				knockMeUp(V.PC, 100, 0, -4);
 			}
-			r.push(`By the time the gangbang ends, you are left bloated with cum on the floor. The only thought in your mind being when you can come back and do this again. <span class="red">Rumors of the arcology owner being a rape slut spreads around.</span>`);
-			repX((V.rep * .9) - V.rep, "PCactions");
-			V.PC.degeneracy += 10;
-			V.raped = 0;
+			r.push(`By the time the gangbang ends, you are left bloated and bathed with cum on the floor. The only thought in your mind being when you can come back and do this again. <span class="red">Rumors of the arcology owner being a rape slut spreads around.</span>`);
+			repX((V.rep * .95) - V.rep, "PCactions");
+			V.PC.degeneracy += 5;
 			V.rapedTimes++;
-			App.Events.addParagraph(node, r);
+			V.raped = 2;
+			
+			if (V.arcologyUpgrade.drones === 1) {
+				if ( random(0, 4) === 1 ) {
+					r.push(`Your patrolling arcology drones notice a disturbance in the alleyway, and begin swooping down, lights flashing. Though most of the participants scatter, one is caught.`);
+					V.raped = 0;
+				} else {
+					r.push(`Your patrolling arcology drones notice a disturbance in the alleyway, and begin swooping down, lights flashing. Most of the participants scurry away as the drones form a defensive ring around you.`);
+				}
+				if (V.assistant.personality === 1 ) {
+					r.push(`You hear your personal assistant's voice crackle out of one of the drones, apologizing about arriving late.`);
+					if ( V.rapedTimes > 10) {
+						r.push(`Though it sounds a tinge sarcastic considering it's the ${V.rapedTimes} time your assistant has found you like this.`);
+					}
+				}
+				r.push(`With the help of your drones ${(V.BodyguardID !== 0) ? `and bodyguard, who has watched on in a stupor,` : `,`} you get back on your feet and are escorted back to your penthouse.`);
+			} else if (V.BodyguardID !== 0 ) {
+				r.push(`With the help of your bodyguard, who had been watching the entire time, you get back on your feet and are escorted back to your penthouse.`);
+			}
 		} else {
 			r.push(`While returning from a meeting with a prospective investor, an unfortunate wrong turn has led you into a rather seedy area of your arcology. You feel distinctly uncomfortable for some reason.`);
 			if (isPCCareerInCategory("mercenary") || V.PC.skill.warfare >= 85) {
@@ -126,7 +144,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 		App.Events.addParagraph(node, r);
 		if (V.raped === 1) {
 			r = [];
-			if (V.rapedTimes !== 1) {
+			if (V.rapedTimes === undefined) {
 				V.fcnn.push("...plans for increased security measures, but refused to answer questions regarding...");
 				if (V.PC.vagina >= 0) {
 					r.push(Spoken(rapist, `"Well, well, well, look what ${(V.PC.belly >= 5000 || V.PC.preg >= 20 || V.PC.weight >= 130) ? `waddled` : `walked`} into my territory. If it isn't ${V.PC.slaveName}, come to grace me with ${hisP} presence."`));
@@ -137,12 +155,12 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 			} else {
 				V.fcnn.push("...though denying the possibility, the torn clothing points to...");
 				if (V.PC.vagina > 0) {
-					r.push(Spoken(rapist, `"Back again? If it isn't ${V.PC.slaveName}, come to grace me with ${hisP} presence."`));
+					r.push(Spoken(rapist, `"Back again? Still haven't learned to get a guard?"`));
 				} else if (V.PC.vagina === 0){
 					r.push(Spoken(rapist, `"I've heard that you've undone the damage. It brings a tear to my eye that you're letting me break you in again."`));
-				} 
+				}
+				V.rapedTimes++;
 			}
-			V.rapedTimes++;
 			
 			r.push(`The ${woman} binds your hands behind you, all the while keeping the knife to your throat.`);
 			r.push(Spoken(rapist, `"Smart keeping your mouth shut; maybe I won't have to hurt you. Heh, I know what you're thinking, that you'll find out who I am and punish me. Don't worry, I made sure to not to leave you any trails to follow${V.PC.visualAge < V.minimumSlaveAge ? ", especially with you being so sinfully delectable" : ""}. Now let's see what we have here."`));
@@ -604,7 +622,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 				r.push(`It would be prudent to up security in your arcology, that or take a guard along when you leave the penthouse. You can't allow such an indignity to happen again, nor do you need the stress of a bastard trying to seize control of your estate when you want to retire, but you wouldn't mind having your way with ${him} if you get the chance.`);
 				App.Events.addParagraph(node, r);
 			}
-		} else {
+		} else if (V.raped === 0) {
 			App.UI.DOM.appendNewElement("div", node, `Now the only question is what to do with the would-be rapist. You could toss them out of the arcology, but it might be more fun to turn the tables on ${him}.`);
 
 			let slaveCosts = slaveCost(rapist);
-- 
GitLab


From 87cc71ff8674799adb3a41fac6e35d4907be6fdf Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Sat, 20 Aug 2022 01:20:19 +0900
Subject: [PATCH 09/29] adding client details to whoring

---
 src/endWeek/economics/persBusiness.js | 124 +++++++++++++++++++++++++-
 1 file changed, 122 insertions(+), 2 deletions(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index c428b695819..326b08af62c 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -13,11 +13,131 @@ App.EndWeek.personalBusiness = function() {
 	let catchTChance;
 	let upgradeCount;
 	let dataGain;
+	
+	/** Find a way weave other FC in, extend. */
 	function getWhoringClient() {
-		let c = `You arive at the apartment of your client, one of the millionaires of your arcology. You greet him with a kiss and turn up your charm. Having dinner at a fancy restaurant, you hang on to his arms and play the role of escort perfectly. Perhaps too well, as soon he drags you into the bathroom for a quick session. You work your hips into his as he fucks you over the sink. Soon you leave the restaurant with more than just fancy food filling your belly. However the date is not over, as he continues filling your other holes in the car.`;
-		return c;
+		let passage = ``;
+		let drink = (V.arcologies[0].FSPastoralistLaw === 1) ? `milk mead` : `liquor`;
+		let attitude = random(0, 3); // Find a way to set this in PCPerversion once implemented
+		let clientClass = random(0, 2);
+		let clientGender = random(0, 1);
+		let clientPassage = `Your client today is ${getClientClass(clientClass)} of the arcology. You arive at the ${getClientLocation(clientClass)} ${generateClientDescription(clientGender, clientClass)}`;
+
+		passage += clientPassage;
+		let clientSex = `You are due to ${generateActivity(clientGender, clientClass)}.`;
+		passage += clientSex;
+		// Your client today is x. You arrive at the x of your client, who is currently x. You greet ? with a kiss. You are due to do x. Sex event. Sex Event 2. Sex Event 3. Ending.
+		//  have dinner at a fancy restaurant, you hang on to his arms and play the role of escort perfectly. Perhaps too well, as soon he drags you into the bathroom for a quick session. You work your hips into his as he fucks you over the sink. Soon you leave the restaurant with more than just fancy food filling your belly. However the date is not over, as he continues filling your other holes in the car.`
+		return passage;
+	};
+	
+	function generateActivity(clientGender, clientClass, activityNum){
+		switch (clientClass) {
+			case 0:
+				// millionaire
+				return `${generateMillionaireActivity(clientGender)}`;
+			case 1:
+				// upper class
+				return `${generateUpperClassActivity(clientGender)}`;
+			case 2:
+				// tourist
+				return `${generateTouristActivity(clientGender)}`;
+			default:
+				return `UNIMPLEMENTED ACTIVITY SOMEHOW`;
+	};
+	
+	function generateMillionaireActivity(clientGender){
+		// find way to standardize this.
+		let him = [`him`, `her`, `her`, `it`];
+		let he = [`he`, `she`, `she`, `it`]
+		let his = [`his`, `her`, `her`, `its`]
+		// switch random generated activity
+		switch (random(0, 4)) {
+			case 0:
+				return ``;
+			case 1:
+				return ``;
+			case 2:
+				return ``;
+			case 3:
+				return ``;
+			default:
+				return `MILLIONAIRE ACTIVITY BROKEN`;
+		}
+	}
+	
+	function generateClientDescription(clientGender, clientClass) {
+		switch (clientClass) {
+			case 0:
+				if (clientGender === 0) {
+					// male
+					return `You greet him with a ${getWhoringAttitude(attitude)} kiss, savouring the taste of ${drink} on his lips, and turn up your charm as you feel something rise in his pants.`;
+				} else if (clientGender === 1) {
+					// female
+					return `You greet her with a ${getWhoringAttitude(attitude)} kiss, tasting the luxurious ${drink} on her lips, and turn up your charm as you see her face flush.`;
+				} else {
+					// futa
+					return `You greet her with a ${getWhoringAttitude(attitude)} kiss, tasting the luxurious ${drink} on her lips, and turn up your charm as you see something push outwards from her skirt.`;
+				}
+				break;
+			case 1:
+				if (clientGender === 0) {
+					// male
+					return `You greet him with a ${getWhoringAttitude(attitude)} kiss, savouring the taste of ${drink} on his lips, and turn up your charm as you feel something rise in his pants.`;
+				} else if (clientGender === 1) {
+					// female
+					return `You greet her with a ${getWhoringAttitude(attitude)} kiss, tasting the luxurious ${drink} on her lips, and turn up your charm as you see her face flush.`;
+				} else {
+					// futa
+					return `You greet her with a ${getWhoringAttitude(attitude)} kiss, tasting the luxurious ${drink} on her lips, and turn up your charm as you see something push outwards from her skirt.`;
+				}
+				break;
+			case 2:
+				if (clientGender === 0) {
+					// male
+					return `You greet him with a ${getWhoringAttitude(attitude)} kiss, savouring the taste of ${drink} on his lips, and turn up your charm as you feel something rise in his pants.`;
+				} else if (clientGender === 1) {
+					// female
+					return `You greet her with a ${getWhoringAttitude(attitude)} kiss, tasting the luxurious ${drink} on her lips, and turn up your charm as you see her face flush.`;
+				} else {
+					// futa
+					return `You greet her with a ${getWhoringAttitude(attitude)} kiss, tasting the luxurious ${drink} on her lips, and turn up your charm as you see something push outwards from her skirt.`;
+				}
+				break;
+			default:
+				return `UNIMPLEMENTED CLIENT DESCRIPTION`;
+		}
+	};
+	
+	function getClientClass(clientClass) {
+		switch (clientClass) {
+			case 0 : return `a millionaire`;
+			case 1 : return `an upper class member`;
+			case 2 : return `a tourist`;
+			default : return `UNIMPLEMENTED CLIENT CLASS`;
+		}
+	}
+	
+	function getClientLocation(clientClass) {
+		switch (clientClass) {
+			case 0 : return ` penthouse of your client, who is currently drinking at the sofa.`;
+			case 1 : return ` luxury apartment of your client, who is currently enjoying a slave.`;
+			case 2 : return ` hotel of your client, who is currently waiting on the bed.`;
+			default : return `UNIMPLEMENTED CLIENT LOCATION`;
+		}
 	}
 	
+	function getWhoringAttitude(attitude) {
+		switch (attitude) {
+			case 0 : return `passionate`;
+			case 1 : return `reluctant`;
+			case 2 : return `hesitant`;
+			case 3 : return `forceful`;
+			case 4 : return `chaste`;
+			default : return `BROKEN ATTITUDE`;
+		}
+	};
+	
 	if (V.useTabs === 0) {
 		App.UI.DOM.appendNewElement("h2", el, `Personal Business`);
 	}
-- 
GitLab


From 85edb5a3cf2853c3098368a6805c8aa5480058f4 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Sat, 20 Aug 2022 02:57:26 +0900
Subject: [PATCH 10/29] whoring client generation pre-test

---
 src/endWeek/economics/persBusiness.js | 56 ++++++++++++++++++++-------
 1 file changed, 41 insertions(+), 15 deletions(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index 326b08af62c..bd329d315c3 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -27,7 +27,6 @@ App.EndWeek.personalBusiness = function() {
 		let clientSex = `You are due to ${generateActivity(clientGender, clientClass)}.`;
 		passage += clientSex;
 		// Your client today is x. You arrive at the x of your client, who is currently x. You greet ? with a kiss. You are due to do x. Sex event. Sex Event 2. Sex Event 3. Ending.
-		//  have dinner at a fancy restaurant, you hang on to his arms and play the role of escort perfectly. Perhaps too well, as soon he drags you into the bathroom for a quick session. You work your hips into his as he fucks you over the sink. Soon you leave the restaurant with more than just fancy food filling your belly. However the date is not over, as he continues filling your other holes in the car.`
 		return passage;
 	};
 	
@@ -44,25 +43,52 @@ App.EndWeek.personalBusiness = function() {
 				return `${generateTouristActivity(clientGender)}`;
 			default:
 				return `UNIMPLEMENTED ACTIVITY SOMEHOW`;
+		}
 	};
 	
-	function generateMillionaireActivity(clientGender){
-		// find way to standardize this.
+	function getClientPronoun(clientGender, pronoun) {
 		let him = [`him`, `her`, `her`, `it`];
 		let he = [`he`, `she`, `she`, `it`]
 		let his = [`his`, `her`, `her`, `its`]
+		switch (pronoun) {
+			case `he`: return he[clientGender];
+			case `him`: return him[clientGender];
+			case `his`: return his[clientGender];
+			default: return `<span class="red">UNSUPPORTED PRONOUN</span>`;
+		}
+	}
+	
+	function generateMillionaireActivity(clientGender){
 		// switch random generated activity
-		switch (random(0, 4)) {
+		switch (random(0, 1)) {
 			case 0:
-				return ``;
+				return `eat together at a fancy restaurant. The client leads you out of the penthouse and to a prepared car. You ride in luxury, and butter up your client with small talk and compliments. The chosen venue is a naked sushi bar, and today you'll act as the platter. You lay down on the cold ice sheets as the sushi chef delicately places ice cold fish on your delicates. Your nipples and clit feel especially sensitive to the cold fish. You are rolled out in front of your client, who wastes no time in picking off pieces of fish. They often grab your nipples and clit with chopsticks, acting as if it was done on accident. The teasing grows, until they begin penetrating you with the utensils. It devolves into full blown sex.`;
 			case 1:
-				return ``;
-			case 2:
-				return ``;
-			case 3:
-				return ``;
+				return `eat together at a sushi restaurant. You hang on to their arms and play the role of escort perfectly. Perhaps too well, as soon they drag you into the bathroom and puts you to your other work. You rock your hips into theirs as they fuck you over the sink. Soon you leave the restaurant with more than just fancy food filling your belly. However the date is not over, as they continue filling your other holes in the car on the way back.`;
+			default:
+				return `<span class="red">MILLIONAIRE ACTIVITY BROKEN</span>`;
+		}
+	}
+	
+	function generateUpperClassActivity(clientGender) {
+		switch (random(0, 1)) {
+			case 0:
+				return `unimplemented`;
+			case 1:
+				return `unimplemented`;
+			default:
+				return `<span class="red">UPPERCLASS ACTIVITY BROKEN</span>`;
+		}
+	}
+	
+	function generateTouristActivity(clientGender) {
+		switch (random(0, 1)) {
+			case 0:
+				return `unimplemented`;
+			case 1:
+				return `unimplemented`;
 			default:
-				return `MILLIONAIRE ACTIVITY BROKEN`;
+				return `<span class="red">UPPERCLASS ACTIVITY BROKEN</span>`;
 		}
 	}
 	
@@ -105,7 +131,7 @@ App.EndWeek.personalBusiness = function() {
 				}
 				break;
 			default:
-				return `UNIMPLEMENTED CLIENT DESCRIPTION`;
+				return `<span class="red">ERROR CLIENT DESCRIPTION</span>`;
 		}
 	};
 	
@@ -114,7 +140,7 @@ App.EndWeek.personalBusiness = function() {
 			case 0 : return `a millionaire`;
 			case 1 : return `an upper class member`;
 			case 2 : return `a tourist`;
-			default : return `UNIMPLEMENTED CLIENT CLASS`;
+			default : return `<span class="red">ERROR CLIENT CLASS</span>`;
 		}
 	}
 	
@@ -123,7 +149,7 @@ App.EndWeek.personalBusiness = function() {
 			case 0 : return ` penthouse of your client, who is currently drinking at the sofa.`;
 			case 1 : return ` luxury apartment of your client, who is currently enjoying a slave.`;
 			case 2 : return ` hotel of your client, who is currently waiting on the bed.`;
-			default : return `UNIMPLEMENTED CLIENT LOCATION`;
+			default : return `<span class="red">ERROR CLIENT LOCATION</span>`;
 		}
 	}
 	
@@ -134,7 +160,7 @@ App.EndWeek.personalBusiness = function() {
 			case 2 : return `hesitant`;
 			case 3 : return `forceful`;
 			case 4 : return `chaste`;
-			default : return `BROKEN ATTITUDE`;
+			default : return `<span class="red">ERROR IN ATTITUDE</span>`;
 		}
 	};
 	
-- 
GitLab


From ba0d56ce8ef73541cce58aefc93a17251f9fd2be Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Sat, 20 Aug 2022 10:07:21 +0900
Subject: [PATCH 11/29] implemented PC tracking for whoring acts, extended
 client info, client pregnancy tracking, variable tracking additions, partner
 tracking for rapes and whoring.

---
 src/endWeek/economics/persBusiness.js | 82 ++++++++++++++++++++-------
 src/events/nonRandom/pRaped.js        | 30 +++++++---
 src/events/scheduled/sePlayerBirth.js |  5 ++
 src/js/sexActsJS.js                   |  2 +
 src/player/js/PlayerState.js          |  4 +-
 src/player/managePersonalAffairs.js   |  6 ++
 6 files changed, 99 insertions(+), 30 deletions(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index bd329d315c3..a854eeeaf5d 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -15,36 +15,65 @@ App.EndWeek.personalBusiness = function() {
 	let dataGain;
 	
 	/** Find a way weave other FC in, extend. */
-	function getWhoringClient() {
+	function getWhoringClient(clientClass) {
+		// clientClass 0 = millionare, 1 = upperclass, 2 = tourist
 		let passage = ``;
-		let drink = (V.arcologies[0].FSPastoralistLaw === 1) ? `milk mead` : `liquor`;
-		let attitude = random(0, 3); // Find a way to set this in PCPerversion once implemented
-		let clientClass = random(0, 2);
-		let clientGender = random(0, 1);
+		let clientGender = random(0, 3); // male, female, futa, geld
 		let clientPassage = `Your client today is ${getClientClass(clientClass)} of the arcology. You arive at the ${getClientLocation(clientClass)} ${generateClientDescription(clientGender, clientClass)}`;
 
 		passage += clientPassage;
-		let clientSex = `You are due to ${generateActivity(clientGender, clientClass)}.`;
+		let clientSex = `You are due to ${generateActivity(clientGender, clientClass)}`;
 		passage += clientSex;
 		// Your client today is x. You arrive at the x of your client, who is currently x. You greet ? with a kiss. You are due to do x. Sex event. Sex Event 2. Sex Event 3. Ending.
+		if (canGetPregnant(V.PC)) {
+			if (clientGender !== 1 && clientGender !== 3){
+				if (clientClass === 5) {
+					// elite
+					passage += `The elites are try particularly hard to seed your approved womb.`;
+					knockMeUp(V.PC, 70, 0, -6);
+				} else if (clientClass === 6) {
+					// former master
+					passage += `You can do nothing but obediently take your master's dick all the way into your womb, letting the cum flood in over and over. Your former master is determined to leave a parting gift.`;
+					knockMeUp(V.PC, 100, 0, -3);
+				} else if (clientClass === 4) {
+					// tourist client
+					knockMeUp(V.PC, 20, 0, -5);
+				} else {
+					// random citizen
+					knockMeUp(V.PC, 20, 0, -2);
+				}
+			}
+		}
+		passage += `The ${getClientClass(clientClass).split(" ")[1]} gives you a kiss as you leave, <span class="yellowgreen">thanking you</span> for the "date".`;
 		return passage;
-	};
+	}
 	
-	function generateActivity(clientGender, clientClass, activityNum){
+	function generateActivity(clientGender, clientClass){
 		switch (clientClass) {
 			case 0:
 				// millionaire
 				return `${generateMillionaireActivity(clientGender)}`;
 			case 1:
 				// upper class
-				return `${generateUpperClassActivity(clientGender)}`;
+				return `upperclass sex noises`;
 			case 2:
+				// middle class
+				return `middle class noises`;
+			case 3:
+				// lower class
+				return `lower class sex noises`;
+			case 4:
 				// tourist
-				return `${generateTouristActivity(clientGender)}`;
+				return `tourist sex noises`;
+			case 5:
+				// societal elite
+				return `societal elite sex noises.`;
+			case 6:
+				return `former master sex noises`;
 			default:
 				return `UNIMPLEMENTED ACTIVITY SOMEHOW`;
 		}
-	};
+	}
 	
 	function getClientPronoun(clientGender, pronoun) {
 		let him = [`him`, `her`, `her`, `it`];
@@ -93,6 +122,8 @@ App.EndWeek.personalBusiness = function() {
 	}
 	
 	function generateClientDescription(clientGender, clientClass) {
+		let drink = (V.arcologies[0].FSPastoralistLaw === 1) ? `milk mead` : `liquor`;
+		let attitude = random(0, 3); // Find a way to set this in PCPerversion once implemented
 		switch (clientClass) {
 			case 0:
 				if (clientGender === 0) {
@@ -101,11 +132,9 @@ App.EndWeek.personalBusiness = function() {
 				} else if (clientGender === 1) {
 					// female
 					return `You greet her with a ${getWhoringAttitude(attitude)} kiss, tasting the luxurious ${drink} on her lips, and turn up your charm as you see her face flush.`;
-				} else {
-					// futa
-					return `You greet her with a ${getWhoringAttitude(attitude)} kiss, tasting the luxurious ${drink} on her lips, and turn up your charm as you see something push outwards from her skirt.`;
 				}
-				break;
+				// futa
+				return `You greet her with a ${getWhoringAttitude(attitude)} kiss, tasting the luxurious ${drink} on her lips, and turn up your charm as you see something push outwards from her skirt.`;
 			case 1:
 				if (clientGender === 0) {
 					// male
@@ -117,7 +146,6 @@ App.EndWeek.personalBusiness = function() {
 					// futa
 					return `You greet her with a ${getWhoringAttitude(attitude)} kiss, tasting the luxurious ${drink} on her lips, and turn up your charm as you see something push outwards from her skirt.`;
 				}
-				break;
 			case 2:
 				if (clientGender === 0) {
 					// male
@@ -129,7 +157,6 @@ App.EndWeek.personalBusiness = function() {
 					// futa
 					return `You greet her with a ${getWhoringAttitude(attitude)} kiss, tasting the luxurious ${drink} on her lips, and turn up your charm as you see something push outwards from her skirt.`;
 				}
-				break;
 			default:
 				return `<span class="red">ERROR CLIENT DESCRIPTION</span>`;
 		}
@@ -223,6 +250,9 @@ App.EndWeek.personalBusiness = function() {
 			r.push(`You have finally recovered from your injuries.`);
 		}
 	} else if (V.personalAttention.task === PersonalAttention.WHORING) {
+		let clientClass = random(0, 4);
+		let clientID = -5;
+		V.PC.vaginaLube = 1;
 		income = random(2000, 4500);
 		if (V.PC.belly >= 1500) {
 			if (V.arcologies[0].FSRepopulationFocus !== "unset") {
@@ -251,7 +281,7 @@ App.EndWeek.personalBusiness = function() {
 					if (V.PC.degeneracy > 1) {
 						V.PC.degeneracy -= 1;
 					}
-					
+					clientID = -6;
 				}
 			} else {
 				income = random(5, 2500);
@@ -260,6 +290,10 @@ App.EndWeek.personalBusiness = function() {
 				repX((V.rep * .9) - V.rep, "personalBusiness");
 				V.enduringRep *= .9;
 			}
+			seX(V.PC, "vaginal", clientID, "penetrative", random(3, 15));
+			seX(V.PC, "anal", clientID, "penetrative", random(10, 40));
+			seX(V.PC, "oral", clientID, "penetrative", random(12, 25));
+			seX(V.PC, "mammary", clientID, "penetrative", random(12, 25));
 		} else {
 			if (V.rep < 3000) {
 				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 500)))}</span> for your body. You being unknown helps you <span class="yellow">stay under the radar.</span>`);
@@ -269,6 +303,7 @@ App.EndWeek.personalBusiness = function() {
 					r.push(`You focus on entertaining the cream of society this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 300)))}</span> for your body. Doing such things <span class="green">improves your reputation.</span>`);
 					cashX(Math.trunc(income * (V.rep / 300)), "personalBusiness");
 					repX(V.rep * 0.05, "personalBusiness");
+					clientClass = random(0, 1);
 				} else {
 					r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 500)))}</span> for your body. Doing such things <span class="green">improves your reputation.</span>`);
 					cashX(Math.trunc(income * (V.rep / 500)), "personalBusiness");
@@ -279,7 +314,8 @@ App.EndWeek.personalBusiness = function() {
 			if (canGetPregnant(V.PC)) {
 				if (V.arcologies[0].FSRestart !== "unset") {
 					r.push(`You make sure your client is of the correct pedigree, so even though you aren't on birth control at least the resulting baby is approved by the elites.`);
-					r.push(knockMeUp(V.PC, 20, 0, -6));
+					clientClass = 0;
+					clientID = -6;
 				} else {
 					if (V.arcologies[0].FSRepopulationFocus !== "unset" && random(1, 100) > 80) {
 						r.push(`A horny client offered you an extra <span class="yellowgreen">${cashFormat(1000)}</span> for downing some fertility drugs. You're already forgoing birth control, so what harm could an extra baby do?`);
@@ -294,12 +330,14 @@ App.EndWeek.personalBusiness = function() {
 						}
 						V.PC.forcedFertDrugs += 2;
 					}
-					r.push(knockMeUp(V.PC, 20, 0, -5));
 				}
 			}
-			
+			seX(V.PC, "vaginal", clientID, "penetrative", random(10, 30));
+			seX(V.PC, "anal", clientID, "penetrative", random(10, 30));
+			seX(V.PC, "oral", clientID, "penetrative", random(10, 30));
+			seX(V.PC, "mammary", clientID, "penetrative", random(10, 20));
 		}
-		r.push(getWhoringClient());
+		r.push(getWhoringClient(clientClass));
 	} else if (V.personalAttention.task === PersonalAttention.MAID) {
 		if (V.PC.belly >= 5000) {
 			r.push(`You spend your free time hustling around your penthouse, cleaning and making sure everything is in order. You manage to reduce your upkeep by 20%. Your`);
diff --git a/src/events/nonRandom/pRaped.js b/src/events/nonRandom/pRaped.js
index 6f4e962e7d7..c6c90cf12fb 100644
--- a/src/events/nonRandom/pRaped.js
+++ b/src/events/nonRandom/pRaped.js
@@ -50,9 +50,10 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 		} = getPronouns(rapist);
 		const {say} = getEnunciation(rapist);
 		V.raped = 1;
-		if (V.rapedTimes > 5) {
-			r.push(`While returning from a meeting with a prospective investor, a purposeful wrong turn has led you into a rather seedy area of your arcology. You feel a rush of lust for some reason. You've already stripped off your clothes, baring your ${(V.PC.belly >= 5000 || V.PC.preg >= 20) ? `swollen belly` : `naked body`} to the dark alleyways.`);
-			if (V.PC.pregSource === -4) {
+		if (V.rapedTimes >= 5 && isPCCareerInCategory("escort") && PC.vagina !== -1) {
+			V.PC.vaginaLube = 2;
+			r.push(`While returning from a meeting with a prospective investor, a purposeful wrong turn has led you into a rather familiar seedy area of your arcology. You feel a rush of lust for some reason and your pussy begins to drip. You've already stripped off your clothes, baring your ${(V.PC.belly >= 5000 || V.PC.preg >= 20) ? `swollen belly` : `naked body`} to the dark alleyways.`);
+			if (V.PC.pregSource === -10) {
 				r.push(`You proudly show off the mark the rapists have left on your body, gently cradling where the rape baby is growing.`);
 			}
 			if (V.BodyguardID !== 0) {
@@ -65,14 +66,29 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 			r = [];
 			if (canGetPregnant(V.PC)) {
 				r.push(`Your cervix is pounded raw. Each participant makes sure to only cum when hilted inside you, and your toes curl as you feel your belly swells with a volatile mix of cum. Your womb becomes a battlefield as the gangbang sperm fight to be the first to fertilize you.`);
-				knockMeUp(V.PC, 100, 0, -4);
+				knockMeUp(V.PC, 100, 0, -10);
 			}
 			r.push(`By the time the gangbang ends, you are left bloated and bathed with cum on the floor. The only thought in your mind being when you can come back and do this again. <span class="red">Rumors of the arcology owner being a rape slut spreads around.</span>`);
-			repX((V.rep * .95) - V.rep, "PCactions");
 			V.PC.degeneracy += 5;
 			V.rapedTimes++;
 			V.raped = 2;
-			
+			repX((V.rep * .95) - V.rep, "PCactions");
+			seX(V.PC, "vaginal", -10, "penetrative", random(12, 40));
+			seX(V.PC, "anal", -10, "penetrative", random(12, 40));
+			seX(V.PC, "oral", -10, "penetrative", random(12, 40));
+			seX(V.PC, "mammary", -10, "penetrative", random(12, 40));
+			if (V.arcologies[0].FSRestart !== "unset") {
+				if (V.eugenicsFullControl !== 1) {
+					r.push(`The societal elite are <span class="red">particularly angry at the rumors</span> of your baby being a rape baby.`);
+					V.failedElite += 20;
+					if (V.PC.pregSource === -6 || V.PC.pregSource === -1) {
+						r.push(`Though they are <span class="yellow">mollified</span> by a quick paternity test, and move to protect the reputation of their elite womb.`);
+						V.failedElite -= 10;
+						repX(V.rep - (V.rep * .95), "PCactions")
+					}
+				}
+			}
+
 			if (V.arcologyUpgrade.drones === 1) {
 				if ( random(0, 4) === 1 ) {
 					r.push(`Your patrolling arcology drones notice a disturbance in the alleyway, and begin swooping down, lights flashing. Though most of the participants scatter, one is caught.`);
@@ -402,7 +418,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 						r.push(`not climaxing...`);
 					}
 					r.push(`Is this what it feels like to be bred by someone so dominant? You should take a pregnancy test right away and make sure ${he} didn't knock you up.`);
-					knockMeUp(V.PC, 100, 0, -2);
+					knockMeUp(V.PC, 100, 0, -10);
 				}
 				if (V.PC.vagina === 0) {
 					V.PC.vagina++;
diff --git a/src/events/scheduled/sePlayerBirth.js b/src/events/scheduled/sePlayerBirth.js
index 2ab4b6afa01..07e5127987e 100644
--- a/src/events/scheduled/sePlayerBirth.js
+++ b/src/events/scheduled/sePlayerBirth.js
@@ -61,6 +61,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 		let elite = 0;
 		let lab = 0;
 		let futaS = 0;
+		let rape = 0;
 		let slavesLength = 0;
 		let babies = [];
 		for (const baby of birthed) {
@@ -91,6 +92,9 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 			} else if (baby.fatherID === -9) {
 				futaS++;
 				babies.push("a Futanari Sister");
+			} else if (baby.fatherID === -10){
+				rape++;
+				babies.push("a Rapist");
 			} else {
 				const babyDaddy = getSlave(baby.fatherID);
 				if (babyDaddy) {
@@ -719,6 +723,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 				V.PC.counter.birthClient += clients;
 				V.PC.counter.birthElite += elite;
 				V.PC.counter.birthLab += lab;
+				V.PC.counter.birthRape += rape;
 				V.PC.counter.birthDegenerate += slavesLength;
 
 				if (curBabies === 1) {
diff --git a/src/js/sexActsJS.js b/src/js/sexActsJS.js
index b0f60bcd21f..2db0f8edbae 100644
--- a/src/js/sexActsJS.js
+++ b/src/js/sexActsJS.js
@@ -502,6 +502,8 @@ globalThis.seX = function(slave1, act1, slave2, act2 = "penetrative", count = 1)
 		addPartner(slave1, -8);
 	} else if (typeof slave2 === 'string') {
 		// someday we may track "slaves" and "assistant"
+	} else if (typeof slave2 === 'number'){
+		addPartner(slave1, slave2);
 	} else {
 		actX(slave2, act2, count);
 		addPartner(slave1, slave2);
diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js
index 666b2f1f5a3..3ebc9e643d0 100644
--- a/src/player/js/PlayerState.js
+++ b/src/player/js/PlayerState.js
@@ -102,6 +102,8 @@ App.Entity.PlayerActionsCountersState = class {
 		this.birthSelf = 0;
 		/** how many designer babies you've produced */
 		this.birthLab = 0;
+		/** rape babies */
+		this.birthRape = 0;
 		/** untracked births */
 		this.birthOther = 0;
 		/** how many units of your cum are stored away for artificially inseminating slaves */
@@ -516,7 +518,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * 29-10: shoulder-length
 		 * * 9-0: short
 		 */
-		this.hLength = 2;
+		this.hLength = 9;
 		/**
 		 * eyebrow thickness
 		 * * "pencil-thin"
diff --git a/src/player/managePersonalAffairs.js b/src/player/managePersonalAffairs.js
index 88f69772742..a33472166b5 100644
--- a/src/player/managePersonalAffairs.js
+++ b/src/player/managePersonalAffairs.js
@@ -457,6 +457,10 @@ App.UI.managePersonalAffairs = function() {
 			if (PC.counter.birthLab > 0) {
 				App.UI.DOM.appendNewElement("li", list, `${babies(PC.counter.birthLab)} specially designed in the lab.`);
 			}
+			
+			if (PC.counter.birthRape > 0) {
+				App.UI.DOM.appendNewElement("li", list, `${babies(PC.counter.birthRape)} from being raped.`);
+			}
 
 			return birthsDiv;
 		}
@@ -512,9 +516,11 @@ App.UI.managePersonalAffairs = function() {
 				[-2, `citizens of ${arcology.name}`],
 				[-3, `your former master`],
 				[-4, `another arcology owner`],
+				[-5, `clients for dates`],
 				[-6, `members of the Societal Elite`],
 				[-8, `your animals`],
 				[-9, `members of the Futanari Sisters`],
+				[-10, `rapists`],
 			]);
 
 			for (const [ID, name] of partners) {
-- 
GitLab


From dc391c5f60d03bfab0029ac1cf2c7c561509c2da Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Sat, 20 Aug 2022 10:45:54 +0900
Subject: [PATCH 12/29] reworked whoring and starring in porn, bugfixes

---
 src/endWeek/economics/persBusiness.js |  2 +-
 src/endWeek/economics/reputation.js   | 29 ++++++++++++++++++++++-----
 src/endWeek/saPorn.js                 |  2 +-
 src/interaction/siRecords.js          |  6 +++++-
 4 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index a854eeeaf5d..33d8e220a34 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -253,7 +253,7 @@ App.EndWeek.personalBusiness = function() {
 		let clientClass = random(0, 4);
 		let clientID = -5;
 		V.PC.vaginaLube = 1;
-		income = random(2000, 4500);
+		income = Math.trunc(random(400, 900) * (V.PC.skill.trading > 1) ? V.PC.skill.trading : 1);
 		if (V.PC.belly >= 1500) {
 			if (V.arcologies[0].FSRepopulationFocus !== "unset") {
 				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc((income * (V.rep / 500)) + (V.PC.belly)))}</span> for your body, much more than usual; you guess your pregnancy-focused population wants your baby-rounded body more than ever. Doing your part <span class="green">improves your reputation.</span>`);
diff --git a/src/endWeek/economics/reputation.js b/src/endWeek/economics/reputation.js
index de6e1493a4c..fa49abdaea8 100644
--- a/src/endWeek/economics/reputation.js
+++ b/src/endWeek/economics/reputation.js
@@ -581,11 +581,30 @@ App.EndWeek.reputation = function() {
 	}
 
 	if (V.PCSlutContacts === 2) {
-		r.push(`You are actively starring in pornographic videos. While they are rather exclusive, <span class="red">some still leak out to the public,</span> harming your image.`);
-		repX(-50, "PCactions");
-		if (canGetPregnant(V.PC)) {
-			r.push(`That's not all that leaks out of you, considering all your shoots are rubber free.`);
-			knockMeUp(V.PC, 20, 0, -5);
+		if (V.arcologies[0].FSRestart !== "unset") {
+			r.push(`You are actively starring in pornographic videos. They are extremely exclusive, <span class="yellow">limited only to the societal elite</span>, who act as a shield to protect your reputation.`);
+			if (V.eugenicsFullControl !== 1) {
+				V.failedElite -= 5;
+			}
+			if (canGetPregnant(V.PC)) {
+				r.push(`Though in exchange they thoroughly seed your fertile womb.`);
+				knockMeUp(V.PC, 50, 0, -6);
+			}
+			seX(V.PC, "vaginal", -6, "penetrative", random(5, 10));
+			seX(V.PC, "oral", -6, "penetrative", random(5, 10));
+			seX(V.PC, "mammary", -6, "penetrative", random(5, 10));
+			seX(V.PC, "anal", -6, "penetrative", random(5, 10));
+		} else {
+			r.push(`You are actively starring in pornographic videos. While they are rather exclusive, <span class="red">some still leak out to the public,</span> harming your image.`);
+			repX(-50, "PCactions");
+			if (canGetPregnant(V.PC)) {
+				r.push(`That's not all that leaks out of you, considering all your shoots are rubber free.`);
+				knockMeUp(V.PC, 20, 0, -5);
+			}
+			seX(V.PC, "vaginal", -5, "penetrative", random(5, 10));
+			seX(V.PC, "oral", -5, "penetrative", random(5, 10));
+			seX(V.PC, "mammary", -5, "penetrative", random(5, 10));
+			seX(V.PC, "anal", -5, "penetrative", random(5, 10));
 		}
 	}
 
diff --git a/src/endWeek/saPorn.js b/src/endWeek/saPorn.js
index 246dd03b182..5486e280b16 100644
--- a/src/endWeek/saPorn.js
+++ b/src/endWeek/saPorn.js
@@ -52,7 +52,7 @@ App.SlaveAssignment.porn = function saPorn(slave) {
 			}
 		}
 		if (slave.porn.spending > 0) {
-			cashX(forceNeg(slave.porn.spending / V.PCSlutContacts), "porn", slave);
+			cashX(forceNeg(slave.porn.spending / (V.PCSlutContacts === 2) ? 5 : 1), "porn", slave);
 		}
 
 		prestigeGen(slave);
diff --git a/src/interaction/siRecords.js b/src/interaction/siRecords.js
index f1887e61a9d..4a72b0d394e 100644
--- a/src/interaction/siRecords.js
+++ b/src/interaction/siRecords.js
@@ -126,7 +126,11 @@ App.UI.SlaveInteract.records = function(slave, refresh) {
 				if (V.PC.career === "escort" || V.PC.career === "prostitute" || V.PC.career === "child prostitute") {
 					r = [];
 					if (V.PC.career === "escort") {
-						r.push(`You retain some contacts from your past life in the industry that may be willing to cut you some discounts should you return to it.`);
+						if (V.arcologies[0].FSRestart !== "unset") {
+							r.push(`You retain some contacts from your past life in the industry who now sit on the elite council, and are willing to provide a discount should you return to it.`);
+						} else {
+							r.push(`You retain some contacts from your past life in the industry that may be willing to cut you some discounts should you return to it.`);
+						}
 					} else {
 						r.push(`You were approached in the past to star in some adult films and they may be willing to cut you some discounts should you accept their offer.`);
 					}
-- 
GitLab


From 8372d039837e41b98bc075c6fc98bf46d8536043 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Sat, 20 Aug 2022 10:54:44 +0900
Subject: [PATCH 13/29] added eugenics interaction to gangbang event

---
 src/events/nonRandom/pRaped.js | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/events/nonRandom/pRaped.js b/src/events/nonRandom/pRaped.js
index c6c90cf12fb..84f30b21319 100644
--- a/src/events/nonRandom/pRaped.js
+++ b/src/events/nonRandom/pRaped.js
@@ -38,7 +38,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 		rapist.height = 180;
 		rapist.origin = `You sentenced $him to enslavement for the attempted rape of a free ${womanP} - you, to be exact.`;
 		rapist.devotion = -100;
-		rapist.trust = -100;
+		rapist.trust = 50;
 		setHealth(rapist, jsRandom(-40, -20), normalRandInt(15, 3), undefined, 1, jsRandom(30, 80));
 		rapist.anus = 0;
 		rapist.behavioralFlaw = "arrogant";
@@ -82,8 +82,9 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
 					r.push(`The societal elite are <span class="red">particularly angry at the rumors</span> of your baby being a rape baby.`);
 					V.failedElite += 20;
 					if (V.PC.pregSource === -6 || V.PC.pregSource === -1) {
-						r.push(`Though they are <span class="yellow">mollified</span> by a quick paternity test, and move to protect the reputation of their elite womb.`);
-						V.failedElite -= 10;
+						r.push(`Though they are <span class="yellow">mollified</span> by a quick paternity test, and move to protect the reputation of their elite breeding womb.`);
+						V.failedElite -= 15;
+						V.PC.degeneracy -= 3;
 						repX(V.rep - (V.rep * .95), "PCactions")
 					}
 				}
-- 
GitLab


From 2d95127c98e6d437ea2f1a478edba7489b5e3208 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Mon, 22 Aug 2022 03:55:33 +0900
Subject: [PATCH 14/29] player sexual experience descn + milk counter pport
 from slave system

---
 src/player/desc/pLongDescription.js |  3 ++-
 src/player/desc/pSexCount.js        | 36 +++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 src/player/desc/pSexCount.js

diff --git a/src/player/desc/pLongDescription.js b/src/player/desc/pLongDescription.js
index 48a175c2f15..5ad27b9307a 100644
--- a/src/player/desc/pLongDescription.js
+++ b/src/player/desc/pLongDescription.js
@@ -65,7 +65,8 @@ App.Desc.Player.longDescription = function(PC = V.PC) {
 		r.push(`You turn your attention to your special place.`);
 	}
 	r.push(App.Desc.Player.crotch());
-
+	r.toParagraph();
+	r.push(App.Desc.Player.sexCount());
 	r.toParagraph();
 	return r.container();
 };
diff --git a/src/player/desc/pSexCount.js b/src/player/desc/pSexCount.js
new file mode 100644
index 00000000000..a3db1428342
--- /dev/null
+++ b/src/player/desc/pSexCount.js
@@ -0,0 +1,36 @@
+App.Desc.Player.sexCount = function(PC = V.PC) {
+	let r = ``;
+	const sexTypes = ["mammary", "vaginal", "anal", "penetrative", "oral"];
+	const totalSex = sexTypes.reduce((res, el) => res += PC.counter[el], 0);
+	if (totalSex > 0) {
+		r += `You have fucked about ${num(totalSex)} times, including `;
+		const sexNames = {
+			mammary: "mammary",
+			vaginal: "vanilla",
+			anal: "anal",
+			penetrative: "penetrating",
+			oral: "oral"
+		};
+		r += sexTypes.filter((t) => PC.counter[t] > 0)
+			.map((t) => `${num(PC.counter[t])} ${sexNames[t]}`)
+			.reduce((res, ch, i, arr) => res + (i === arr.length - 1 ? ' and ' : ', ') + ch);
+		r += ` sexual encounters. `;
+	} else {
+		r += `and has had little or no sexual experience yet. `;
+	}
+	
+	if (PC.lactation > 0 && PC.counter.milk < 20) {
+		r += `You have given a small quantity of milk`;
+		if (PC.counter.cum > 0) {
+			r += ` and about ${num(PC.counter.cum)} deciliters of cum`;
+		}
+		r += `. `;
+	} else if (PC.counter.milk > 1) {
+		r += `You have given about ${num(PC.counter.milk)} liters of milk`;
+		if (PC.counter.cum > 0) {
+			r += ` and about ${num(PC.counter.cum)} deciliters of cum`;
+		}
+		r += `. `;
+	}
+	return r;
+}
\ No newline at end of file
-- 
GitLab


From 16fa5840a9a562140dd467fdb494f4a74ec3da5c Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Mon, 22 Aug 2022 03:56:25 +0900
Subject: [PATCH 15/29] whoring income tweak to utilize player trading skill

---
 src/endWeek/economics/persBusiness.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index 33d8e220a34..82cd8735c8b 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -14,7 +14,7 @@ App.EndWeek.personalBusiness = function() {
 	let upgradeCount;
 	let dataGain;
 	
-	/** Find a way weave other FC in, extend. */
+	/** Find a way weave other FC in, extend, place into own nonREvent */
 	function getWhoringClient(clientClass) {
 		// clientClass 0 = millionare, 1 = upperclass, 2 = tourist
 		let passage = ``;
@@ -253,7 +253,7 @@ App.EndWeek.personalBusiness = function() {
 		let clientClass = random(0, 4);
 		let clientID = -5;
 		V.PC.vaginaLube = 1;
-		income = Math.trunc(random(400, 900) * (V.PC.skill.trading > 1) ? V.PC.skill.trading : 1);
+		income = Math.trunc(random(400, 900) * ((V.PC.skill.trading > 5) ? V.PC.skill.trading / 5 : 5));
 		if (V.PC.belly >= 1500) {
 			if (V.arcologies[0].FSRepopulationFocus !== "unset") {
 				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc((income * (V.rep / 500)) + (V.PC.belly)))}</span> for your body, much more than usual; you guess your pregnancy-focused population wants your baby-rounded body more than ever. Doing your part <span class="green">improves your reputation.</span>`);
-- 
GitLab


From 47a650ace1a9ecb8219aeb2b72a3718b152ae150 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Mon, 22 Aug 2022 13:05:21 +0900
Subject: [PATCH 16/29] small tweak to string style

---
 src/events/scheduled/sePlayerBirth.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/events/scheduled/sePlayerBirth.js b/src/events/scheduled/sePlayerBirth.js
index 07e5127987e..246e31c11ee 100644
--- a/src/events/scheduled/sePlayerBirth.js
+++ b/src/events/scheduled/sePlayerBirth.js
@@ -1112,7 +1112,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 		V.PC.belly = getPregBellySize(V.PC);
 
 		function boarding() {
-			return "You have decided to send them away to be raised in your stead.";
+			return `You have decided to send them away to be raised in your stead.`;
 		}
 
 		function orphanage() {
@@ -1122,7 +1122,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 
 		function citizenSchool() {
 			V.citizenOrphanageTotal += curBabies;
-			return "You have decided to send them to a citizen school to become a future citizen. Perhaps you'll even see them again, though you are unlikely to recognize them if you do.";
+			return `You have decided to send them to a citizen school to become a future citizen. Perhaps you'll even see them again, though you are unlikely to recognize them if you do.`;
 		}
 
 		function privateSchool() {
-- 
GitLab


From 69e2606ce8cef3ba40fcb4e90d39504e3300a43f Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Mon, 22 Aug 2022 13:06:04 +0900
Subject: [PATCH 17/29] refactor income calculation for whoring to avoid double
 calculation.

---
 src/endWeek/economics/persBusiness.js | 64 ++++++++++++++++++---------
 1 file changed, 44 insertions(+), 20 deletions(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index 82cd8735c8b..62642b0dbfb 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -254,27 +254,31 @@ App.EndWeek.personalBusiness = function() {
 		let clientID = -5;
 		V.PC.vaginaLube = 1;
 		income = Math.trunc(random(400, 900) * ((V.PC.skill.trading > 5) ? V.PC.skill.trading / 5 : 5));
+		r.push(`You focus on finding "dates" this week and earn `);
 		if (V.PC.belly >= 1500) {
 			if (V.arcologies[0].FSRepopulationFocus !== "unset") {
-				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc((income * (V.rep / 500)) + (V.PC.belly)))}</span> for your body, much more than usual; you guess your pregnancy-focused population wants your baby-rounded body more than ever. Doing your part <span class="green">improves your reputation.</span>`);
-				cashX(Math.trunc((income * (V.rep / 500)) + (V.PC.belly)), "personalBusiness");
+				income = Math.trunc((income * (V.rep / 500)) + (V.PC.belly));
+				r.push(`<span class="yellowgreen">${cashFormat(income)}</span> for your body, much more than usual; you guess your pregnancy-focused population wants your baby-rounded body more than ever. Doing your part <span class="green">improves your reputation.</span>`);
+				cashX(income, "personalBusiness");
 				repX(400, "personalBusiness");
 			} else if (V.arcologies[0].FSRepopulationFocusPregPolicy === 1) {
-				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc((income * (V.rep / 500)) + (V.PC.belly / 2)))}</span> for your body, more than usual; but that's to be expected, after all, pregnancy is trendy right now. Doing your part <span class="green">improves your reputation.</span>`);
-				cashX(Math.trunc((income * (V.rep / 500)) + (V.PC.belly / 2)), "personalBusiness");
+				income = Math.trunc((income * (V.rep / 500)) + (V.PC.belly / 2));
+				r.push(`<span class="yellowgreen">${cashFormat(income)}</span> for your body, more than usual; but that's to be expected, after all, pregnancy is trendy right now. Doing your part <span class="green">improves your reputation.</span>`);
+				cashX(income, "personalBusiness");
 				repX(200, "personalBusiness");
 			} else if (V.arcologies[0].FSRestart !== "unset") {
 				if (V.PC.pregSource !== -1 && V.PC.pregSource !== -6) {
-					r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(25)},</span> barely enough to cover the abortion the john that gave it to you told you to get. Showing off your gravid body <span class="red">infuriates your citizens and cripples your reputation.</span>`);
+					r.push(`<span class="yellowgreen">${cashFormat(25)},</span> barely enough to cover the abortion the john that gave it to you told you to get. Showing off your gravid body <span class="red">infuriates your citizens and cripples your reputation.</span>`);
 					cashX(25, "personalBusiness");
 					repX((V.rep * .5) - V.rep, "personalBusiness");
 					if (V.eugenicsFullControl !== 1) {
 						V.failedElite += 25;
 					}
-					V.enduringRep *= .9;
+					V.enduringRep *= .8;
 				} else {
-					r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 300)))}</span> for your body. Showing off the womb claimed by the elites placates the council, making them forgive some past transgressions`);
-					cashX(Math.trunc(income * (V.rep / 300)), "personalBusiness");
+					income = Math.trunc(income * (V.rep / 300));
+					r.push(`<span class="yellowgreen">${cashFormat(income)}</span> for your body. Showing off the womb claimed by the elites placates the council, making them forgive some of your past transgressions`);
+					cashX(income, "personalBusiness");
 					if (V.eugenicsFullControl !== 1) {
 						V.failedElite -= 25;
 					}
@@ -284,9 +288,9 @@ App.EndWeek.personalBusiness = function() {
 					clientID = -6;
 				}
 			} else {
-				income = random(5, 2500);
-				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 800)))}</span> for your body, much less than usual; your pregnancy must be turning off potential clients. However, doing such things <span class="red">damages your reputation.</span>`);
-				cashX(Math.trunc(income * (V.rep / 800)), "personalBusiness");
+				income = Math.trunc(random(5, 2500) * (V.rep / 800));
+				r.push(`<span class="yellowgreen">${cashFormat(income)}</span> for your body, much less than usual; your pregnancy must be turning off potential clients. Doing such things <span class="red">damages your reputation.</span>`);
+				cashX(income, "personalBusiness");
 				repX((V.rep * .9) - V.rep, "personalBusiness");
 				V.enduringRep *= .9;
 			}
@@ -296,18 +300,26 @@ App.EndWeek.personalBusiness = function() {
 			seX(V.PC, "mammary", clientID, "penetrative", random(12, 25));
 		} else {
 			if (V.rep < 3000) {
-				r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 500)))}</span> for your body. You being unknown helps you <span class="yellow">stay under the radar.</span>`);
-				cashX(Math.trunc(income * (V.rep / 500)), "personalBusiness");
+				income = Math.trunc(income * (V.rep / 500));
+				r.push(`<span class="yellowgreen">${cashFormat(income)}</span> for your body. You being unknown helps you <span class="yellow">stay under the radar.</span>`);
+				cashX(income, "personalBusiness");
 			} else {
-				if (V.rep > 10000) {
-					r.push(`You focus on entertaining the cream of society this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 300)))}</span> for your body. Doing such things <span class="green">improves your reputation.</span>`);
-					cashX(Math.trunc(income * (V.rep / 300)), "personalBusiness");
-					repX(V.rep * 0.05, "personalBusiness");
+				if (V.rep > 19000) {
+					income = Math.trunc(income * (V.rep / 1000));
+					r.push(`<span class="yellowgreen">${cashFormat(income)}</span> for your body, less than before. Your reputation is so strong only the cream of society dares to approach you, and no one c about your whoring habits.`);
+					cashX(income), "personalBusiness");
+					clientClass = 0;
+				} else if (V.rep > 10000) {
+					income = Math.trunc(income * (V.rep / 200));
+					r.push(`<span class="yellowgreen">${cashFormat(income)}</span> for your body. You mainly focused on entertaining the upper echelons society. Doing such things <span class="red">severely damages your reputation.</span>`);
+					cashX(income), "personalBusiness");
+					repX(V.rep * -0.1, "personalBusiness");
 					clientClass = random(0, 1);
 				} else {
-					r.push(`You focus on finding "dates" this week and earn <span class="yellowgreen">${cashFormat(Math.trunc(income * (V.rep / 500)))}</span> for your body. Doing such things <span class="green">improves your reputation.</span>`);
-					cashX(Math.trunc(income * (V.rep / 500)), "personalBusiness");
-					repX(200, "personalBusiness");
+					income = Math.trunc(income * (V.rep / 400));
+					r.push(`<span class="yellowgreen">${cashFormat(income)}</span> for your body. Doing such things <span class="red">damages your reputation.</span>`);
+					cashX(income, "personalBusiness");
+					repX(V.rep * -0.05, "personalBusiness");
 				}
 
 			}
@@ -337,6 +349,18 @@ App.EndWeek.personalBusiness = function() {
 			seX(V.PC, "oral", clientID, "penetrative", random(10, 30));
 			seX(V.PC, "mammary", clientID, "penetrative", random(10, 20));
 		}
+		if (V.PC.skill.trading < 50) {
+			r.push(`You've quickly picked up some <span class="green">better ways</span> to sell your body.`);
+			IncreasePCSkills('trading', 5);
+		} else if (V.PC.skill.trading < 80) {
+			r.push(`You're able to <span class="green">more accurately</span> price your services.`);
+			IncreasePCSkills('trading', 3);
+		} else if (else if (V.PC.skill.trading < 100) {
+			r.push(`You're <span class="green">learning</span> to squeeze out every last cent from your client.`);
+			IncreasePCSkills('trading', 1);
+		} else {
+			r.push(`You've mastered the ability to squeeze out every last cent from your client.`);
+		}
 		r.push(getWhoringClient(clientClass));
 	} else if (V.personalAttention.task === PersonalAttention.MAID) {
 		if (V.PC.belly >= 5000) {
-- 
GitLab


From 8f193c8ba792ca0b86bae9d05e31e1d2cbb31dba Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Wed, 24 Aug 2022 18:51:40 +0900
Subject: [PATCH 18/29] limit boobTarget depending on new SlimnessFoodLaw

---
 js/003-data/policiesData.js       | 19 +++++++++++++++++++
 src/endWeek/player/prPregnancy.js |  2 +-
 src/endWeek/saAgent.js            |  2 ++
 src/endWeek/saPregnancy.js        |  2 +-
 4 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/js/003-data/policiesData.js b/js/003-data/policiesData.js
index d3ea8334c2b..87892b0a9d7 100644
--- a/js/003-data/policiesData.js
+++ b/js/003-data/policiesData.js
@@ -1584,6 +1584,25 @@ App.Data.Policies.Selection = {
 				note: `Flat slaves will enjoy increased attractiveness to citizens`
 			}
 		],
+		"arcologies[0].FSSlimnessFoodLaw": [
+			{
+				title: "Healthy Slimming Foods",
+				titleClass: "lime",
+				text: "you will do your best to introduce foods that keep your slaves nice and trim, preventing the growth of disgusting flesh.",
+				activatedText: "you have standardized foods that keep your slaves nice and trim, preventing the growth of disgusting flesh.",
+				get requirements() {
+					return (
+						V.arcologies[0].FSGenderRadicalistLawBeauty === 0 &&
+						V.arcologies[0].FSGenderFundamentalistLawBeauty === 0 &&
+						V.arcologies[0].FSGenderRadicalistLawFuta !== 3 &&
+						V.arcologies[0].FSHedonisticDecadenceLaw2 === 0 &&
+						V.arcologies[0].FSPhysicalIdealistLaw === 0 &&
+						V.arcologies[0].FSSlimnessEnthusiast > 20
+					);
+				},
+				note: `Slaves will no longer grow beyond the ideal amount of T&A, none! `
+			}
+		],
 	},
 	FSAssetExpansionist: {
 		"arcologies[0].FSAssetExpansionistSMR": [
diff --git a/src/endWeek/player/prPregnancy.js b/src/endWeek/player/prPregnancy.js
index ddd20fd98f4..0e31ea5fea4 100644
--- a/src/endWeek/player/prPregnancy.js
+++ b/src/endWeek/player/prPregnancy.js
@@ -272,7 +272,7 @@ App.EndWeek.Player.pregnancy = function(PC = V.PC) {
 		if (PC.geneMods.NCS === 1) {
 			// NCS: always working against secondary sexual characteristics even in pregnancies.
 			boobTarget = 0;
-		} else if (PC.geneticQuirks.androgyny === 2) {
+		} else if (PC.geneticQuirks.androgyny === 2 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
 			boobTarget = 400;
 		} else if (PC.physicalAge >= 18) {
 			if (PC.pregType >= 50) {
diff --git a/src/endWeek/saAgent.js b/src/endWeek/saAgent.js
index df50161b1a4..08d82c3df52 100644
--- a/src/endWeek/saAgent.js
+++ b/src/endWeek/saAgent.js
@@ -197,6 +197,8 @@ App.SlaveAssignment.agent = function(slave) {
 			let boobTarget = 0;
 			if (slave.geneMods.NCS === 1) {
 				/* Sort-of No-op, NCS prevents boob growth */
+			} else if (V.arcologies[0].FSSlimnessFoodLaw === 1) {
+				boobTarget = 400;
 			} else if (slave.physicalAge >= 18) {
 				if (slave.pregType >= 50) {
 					boobTarget = 10000;
diff --git a/src/endWeek/saPregnancy.js b/src/endWeek/saPregnancy.js
index 50575bcce00..aef5f034f1b 100644
--- a/src/endWeek/saPregnancy.js
+++ b/src/endWeek/saPregnancy.js
@@ -618,7 +618,7 @@ App.SlaveAssignment.pregnancy = function saPregnancy(slave) {
 		if (slave.geneMods.NCS === 1) {
 			// NCS: always working against secondary sexual characteristics even in pregnancies.
 			boobTarget = 0;
-		} else if (slave.geneticQuirks.androgyny === 2) {
+		} else if (slave.geneticQuirks.androgyny === 2 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
 			boobTarget = 400;
 		} else if (slave.physicalAge >= 18) {
 			if (slave.pregType >= 50) {
-- 
GitLab


From 86ca5a6e92433eddf335ecc38b501ad34bd42b59 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Wed, 24 Aug 2022 19:44:26 +0900
Subject: [PATCH 19/29] limit butt growth, rework values to fit in with
 SlimnessFS limits

---
 src/endWeek/player/prPregnancy.js |  2 +-
 src/endWeek/saAgent.js            | 10 +++++++---
 src/endWeek/saDiet.js             |  4 ++--
 src/endWeek/saHormonesEffects.js  | 12 +++++++++---
 src/endWeek/saPregnancy.js        |  2 +-
 5 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/src/endWeek/player/prPregnancy.js b/src/endWeek/player/prPregnancy.js
index 0e31ea5fea4..212582015eb 100644
--- a/src/endWeek/player/prPregnancy.js
+++ b/src/endWeek/player/prPregnancy.js
@@ -273,7 +273,7 @@ App.EndWeek.Player.pregnancy = function(PC = V.PC) {
 			// NCS: always working against secondary sexual characteristics even in pregnancies.
 			boobTarget = 0;
 		} else if (PC.geneticQuirks.androgyny === 2 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
-			boobTarget = 400;
+			boobTarget = 500;
 		} else if (PC.physicalAge >= 18) {
 			if (PC.pregType >= 50) {
 				boobTarget = 10000;
diff --git a/src/endWeek/saAgent.js b/src/endWeek/saAgent.js
index 08d82c3df52..389291beab3 100644
--- a/src/endWeek/saAgent.js
+++ b/src/endWeek/saAgent.js
@@ -198,7 +198,7 @@ App.SlaveAssignment.agent = function(slave) {
 			if (slave.geneMods.NCS === 1) {
 				/* Sort-of No-op, NCS prevents boob growth */
 			} else if (V.arcologies[0].FSSlimnessFoodLaw === 1) {
-				boobTarget = 400;
+				boobTarget = 500;
 			} else if (slave.physicalAge >= 18) {
 				if (slave.pregType >= 50) {
 					boobTarget = 10000;
@@ -600,10 +600,14 @@ App.SlaveAssignment.agent = function(slave) {
 	}
 
 	if (slave.geneMods.immortality === 1) {
-		if (slave.physicalAge > 26) {
+		let idealAge = V.idealAge;
+		if (slave.geneMods.NCS !== 0) {
+			idealAge = 5;
+		}
+		if (slave.physicalAge > idealAge) {
 			slave.physicalAge--;
 		}
-		if (slave.visualAge > 26) {
+		if (slave.visualAge > idealAge) {
 			slave.visualAge--;
 		}
 	}
diff --git a/src/endWeek/saDiet.js b/src/endWeek/saDiet.js
index dec55084e63..846d3b91e02 100644
--- a/src/endWeek/saDiet.js
+++ b/src/endWeek/saDiet.js
@@ -576,7 +576,7 @@ App.SlaveAssignment.diet = function saDiet(slave) {
 				// }
 			}
 		} else if (weightShift > 0) {
-			if (slave.hormoneBalance > 30 && slave.geneMods.NCS !== 1) { // 'Expected' breast size based on weight for feminine-bodied slaves */
+			if (slave.hormoneBalance > 30 && slave.geneMods.NCS !== 1 && V.arcologies[0].FSSlimnessFoodLaw !== 1) { // 'Expected' breast size based on weight for feminine-bodied slaves */
 				growthGoal = Math.trunc((100 + (slave.weight + 100) * 5 + 2 * slave.lactationAdaptation) * (0.85 + slave.hormoneBalance / 400) * gigantomastiaMod);
 				roll = 600;
 				target = Math.trunc(Math.clamp(weightShift * 20 - (boobSize - growthGoal) / 5, 0, 270));
@@ -606,7 +606,7 @@ App.SlaveAssignment.diet = function saDiet(slave) {
 				roll = 100000;
 				target = Math.trunc(Math.clamp(weightShift * 1000 - (buttSize * 1000 - growthGoal) * 4, 0, 72000));
 			}
-			if (slave.geneMods.NCS === 1) {
+			if (slave.geneMods.NCS === 1 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
 				roll *= 2;
 			}
 			if (random(1, roll) <= target) {
diff --git a/src/endWeek/saHormonesEffects.js b/src/endWeek/saHormonesEffects.js
index 053971b0012..844404c585b 100644
--- a/src/endWeek/saHormonesEffects.js
+++ b/src/endWeek/saHormonesEffects.js
@@ -318,9 +318,15 @@ App.SlaveAssignment.hormonesEffects = function saHormonesEffects(slave) {
 			let normBreasts = 0;
 			let normButt = 0;
 			if (slave.hormoneBalance > 30 && slave.geneMods.NCS !== 1) {
-				/* 'Expected' breast size based on weight for feminine-bodied slaves */
-				normBreasts = Math.trunc((100 + (slave.weight + 100) * 5 + 2 * slave.lactationAdaptation) * (0.85 + slave.hormoneBalance / 400) * gigantomastiaMod);
-				normButt = ((slave.weight + 100) * 0.025 * (0.9 + slave.hormoneBalance / 600) * (rearLipedemaMod / 2 + 1));
+				if (V.arcologies[0].FSSlimnessFoodLaw === 1) {
+					normBreasts = 400;
+					normButt = 1;
+				} else {
+					/* 'Expected' breast size based on weight for feminine-bodied slaves */
+					normBreasts = Math.trunc((100 + (slave.weight + 100) * 5 + 2 * slave.lactationAdaptation) * (0.85 + slave.hormoneBalance / 400) * gigantomastiaMod);
+					normButt = ((slave.weight + 100) * 0.025 * (0.9 + slave.hormoneBalance / 600) * (rearLipedemaMod / 2 + 1));
+				}
+
 			}
 
 			if (slave.hormoneBalance >= 350) {
diff --git a/src/endWeek/saPregnancy.js b/src/endWeek/saPregnancy.js
index aef5f034f1b..9ea91776b62 100644
--- a/src/endWeek/saPregnancy.js
+++ b/src/endWeek/saPregnancy.js
@@ -619,7 +619,7 @@ App.SlaveAssignment.pregnancy = function saPregnancy(slave) {
 			// NCS: always working against secondary sexual characteristics even in pregnancies.
 			boobTarget = 0;
 		} else if (slave.geneticQuirks.androgyny === 2 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
-			boobTarget = 400;
+			boobTarget = 500;
 		} else if (slave.physicalAge >= 18) {
 			if (slave.pregType >= 50) {
 				boobTarget = 10000;
-- 
GitLab


From c1e464efc00461fbb890b8d1ca93c373590d9a49 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Wed, 24 Aug 2022 19:52:16 +0900
Subject: [PATCH 20/29] fixes

---
 src/endWeek/saHormonesEffects.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/endWeek/saHormonesEffects.js b/src/endWeek/saHormonesEffects.js
index 844404c585b..b4cef29e1fd 100644
--- a/src/endWeek/saHormonesEffects.js
+++ b/src/endWeek/saHormonesEffects.js
@@ -319,8 +319,8 @@ App.SlaveAssignment.hormonesEffects = function saHormonesEffects(slave) {
 			let normButt = 0;
 			if (slave.hormoneBalance > 30 && slave.geneMods.NCS !== 1) {
 				if (V.arcologies[0].FSSlimnessFoodLaw === 1) {
-					normBreasts = 400;
-					normButt = 1;
+					normBreasts = 500;
+					normButt = 3;
 				} else {
 					/* 'Expected' breast size based on weight for feminine-bodied slaves */
 					normBreasts = Math.trunc((100 + (slave.weight + 100) * 5 + 2 * slave.lactationAdaptation) * (0.85 + slave.hormoneBalance / 400) * gigantomastiaMod);
-- 
GitLab


From 90c12c5de307a7eea7ad7d04dc723fd7fcabc150 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Wed, 24 Aug 2022 20:50:59 +0900
Subject: [PATCH 21/29] missing parnth

---
 src/endWeek/economics/persBusiness.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index 62642b0dbfb..76073c63132 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -355,7 +355,7 @@ App.EndWeek.personalBusiness = function() {
 		} else if (V.PC.skill.trading < 80) {
 			r.push(`You're able to <span class="green">more accurately</span> price your services.`);
 			IncreasePCSkills('trading', 3);
-		} else if (else if (V.PC.skill.trading < 100) {
+		} else if (V.PC.skill.trading < 100) {
 			r.push(`You're <span class="green">learning</span> to squeeze out every last cent from your client.`);
 			IncreasePCSkills('trading', 1);
 		} else {
-- 
GitLab


From 9336c510e40baba3344021cb82411af67bed8292 Mon Sep 17 00:00:00 2001
From: WhoreAnon <nignog@anon.anon>
Date: Wed, 24 Aug 2022 20:54:47 +0900
Subject: [PATCH 22/29] even more missing parenth

---
 src/endWeek/economics/persBusiness.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index 76073c63132..2c9a11f0041 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -307,12 +307,12 @@ App.EndWeek.personalBusiness = function() {
 				if (V.rep > 19000) {
 					income = Math.trunc(income * (V.rep / 1000));
 					r.push(`<span class="yellowgreen">${cashFormat(income)}</span> for your body, less than before. Your reputation is so strong only the cream of society dares to approach you, and no one c about your whoring habits.`);
-					cashX(income), "personalBusiness");
+					cashX(income, "personalBusiness");
 					clientClass = 0;
 				} else if (V.rep > 10000) {
 					income = Math.trunc(income * (V.rep / 200));
 					r.push(`<span class="yellowgreen">${cashFormat(income)}</span> for your body. You mainly focused on entertaining the upper echelons society. Doing such things <span class="red">severely damages your reputation.</span>`);
-					cashX(income), "personalBusiness");
+					cashX(income, "personalBusiness");
 					repX(V.rep * -0.1, "personalBusiness");
 					clientClass = random(0, 1);
 				} else {
-- 
GitLab


From 3aec3d522c3661d68ba79af1edb4c323c6dddb8b Mon Sep 17 00:00:00 2001
From: WhoreAnon <anon@anon.anon>
Date: Wed, 24 Aug 2022 21:11:44 +0900
Subject: [PATCH 23/29] added new slimness policy to prevent breast and butt
 expansion beyond penalty inducing slimnessFS limits, also affecting PC for
 pregnancy effects.

---
 js/003-data/policiesData.js       | 19 +++++++++++++++++++
 src/endWeek/player/prPregnancy.js |  4 ++--
 src/endWeek/saAgent.js            | 10 ++++++++--
 src/endWeek/saDiet.js             |  4 ++--
 src/endWeek/saHormonesEffects.js  | 12 +++++++++---
 5 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/js/003-data/policiesData.js b/js/003-data/policiesData.js
index d3ea8334c2b..87892b0a9d7 100644
--- a/js/003-data/policiesData.js
+++ b/js/003-data/policiesData.js
@@ -1584,6 +1584,25 @@ App.Data.Policies.Selection = {
 				note: `Flat slaves will enjoy increased attractiveness to citizens`
 			}
 		],
+		"arcologies[0].FSSlimnessFoodLaw": [
+			{
+				title: "Healthy Slimming Foods",
+				titleClass: "lime",
+				text: "you will do your best to introduce foods that keep your slaves nice and trim, preventing the growth of disgusting flesh.",
+				activatedText: "you have standardized foods that keep your slaves nice and trim, preventing the growth of disgusting flesh.",
+				get requirements() {
+					return (
+						V.arcologies[0].FSGenderRadicalistLawBeauty === 0 &&
+						V.arcologies[0].FSGenderFundamentalistLawBeauty === 0 &&
+						V.arcologies[0].FSGenderRadicalistLawFuta !== 3 &&
+						V.arcologies[0].FSHedonisticDecadenceLaw2 === 0 &&
+						V.arcologies[0].FSPhysicalIdealistLaw === 0 &&
+						V.arcologies[0].FSSlimnessEnthusiast > 20
+					);
+				},
+				note: `Slaves will no longer grow beyond the ideal amount of T&A, none! `
+			}
+		],
 	},
 	FSAssetExpansionist: {
 		"arcologies[0].FSAssetExpansionistSMR": [
diff --git a/src/endWeek/player/prPregnancy.js b/src/endWeek/player/prPregnancy.js
index ddd20fd98f4..212582015eb 100644
--- a/src/endWeek/player/prPregnancy.js
+++ b/src/endWeek/player/prPregnancy.js
@@ -272,8 +272,8 @@ App.EndWeek.Player.pregnancy = function(PC = V.PC) {
 		if (PC.geneMods.NCS === 1) {
 			// NCS: always working against secondary sexual characteristics even in pregnancies.
 			boobTarget = 0;
-		} else if (PC.geneticQuirks.androgyny === 2) {
-			boobTarget = 400;
+		} else if (PC.geneticQuirks.androgyny === 2 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
+			boobTarget = 500;
 		} else if (PC.physicalAge >= 18) {
 			if (PC.pregType >= 50) {
 				boobTarget = 10000;
diff --git a/src/endWeek/saAgent.js b/src/endWeek/saAgent.js
index df50161b1a4..389291beab3 100644
--- a/src/endWeek/saAgent.js
+++ b/src/endWeek/saAgent.js
@@ -197,6 +197,8 @@ App.SlaveAssignment.agent = function(slave) {
 			let boobTarget = 0;
 			if (slave.geneMods.NCS === 1) {
 				/* Sort-of No-op, NCS prevents boob growth */
+			} else if (V.arcologies[0].FSSlimnessFoodLaw === 1) {
+				boobTarget = 500;
 			} else if (slave.physicalAge >= 18) {
 				if (slave.pregType >= 50) {
 					boobTarget = 10000;
@@ -598,10 +600,14 @@ App.SlaveAssignment.agent = function(slave) {
 	}
 
 	if (slave.geneMods.immortality === 1) {
-		if (slave.physicalAge > 26) {
+		let idealAge = V.idealAge;
+		if (slave.geneMods.NCS !== 0) {
+			idealAge = 5;
+		}
+		if (slave.physicalAge > idealAge) {
 			slave.physicalAge--;
 		}
-		if (slave.visualAge > 26) {
+		if (slave.visualAge > idealAge) {
 			slave.visualAge--;
 		}
 	}
diff --git a/src/endWeek/saDiet.js b/src/endWeek/saDiet.js
index dec55084e63..846d3b91e02 100644
--- a/src/endWeek/saDiet.js
+++ b/src/endWeek/saDiet.js
@@ -576,7 +576,7 @@ App.SlaveAssignment.diet = function saDiet(slave) {
 				// }
 			}
 		} else if (weightShift > 0) {
-			if (slave.hormoneBalance > 30 && slave.geneMods.NCS !== 1) { // 'Expected' breast size based on weight for feminine-bodied slaves */
+			if (slave.hormoneBalance > 30 && slave.geneMods.NCS !== 1 && V.arcologies[0].FSSlimnessFoodLaw !== 1) { // 'Expected' breast size based on weight for feminine-bodied slaves */
 				growthGoal = Math.trunc((100 + (slave.weight + 100) * 5 + 2 * slave.lactationAdaptation) * (0.85 + slave.hormoneBalance / 400) * gigantomastiaMod);
 				roll = 600;
 				target = Math.trunc(Math.clamp(weightShift * 20 - (boobSize - growthGoal) / 5, 0, 270));
@@ -606,7 +606,7 @@ App.SlaveAssignment.diet = function saDiet(slave) {
 				roll = 100000;
 				target = Math.trunc(Math.clamp(weightShift * 1000 - (buttSize * 1000 - growthGoal) * 4, 0, 72000));
 			}
-			if (slave.geneMods.NCS === 1) {
+			if (slave.geneMods.NCS === 1 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
 				roll *= 2;
 			}
 			if (random(1, roll) <= target) {
diff --git a/src/endWeek/saHormonesEffects.js b/src/endWeek/saHormonesEffects.js
index 053971b0012..b4cef29e1fd 100644
--- a/src/endWeek/saHormonesEffects.js
+++ b/src/endWeek/saHormonesEffects.js
@@ -318,9 +318,15 @@ App.SlaveAssignment.hormonesEffects = function saHormonesEffects(slave) {
 			let normBreasts = 0;
 			let normButt = 0;
 			if (slave.hormoneBalance > 30 && slave.geneMods.NCS !== 1) {
-				/* 'Expected' breast size based on weight for feminine-bodied slaves */
-				normBreasts = Math.trunc((100 + (slave.weight + 100) * 5 + 2 * slave.lactationAdaptation) * (0.85 + slave.hormoneBalance / 400) * gigantomastiaMod);
-				normButt = ((slave.weight + 100) * 0.025 * (0.9 + slave.hormoneBalance / 600) * (rearLipedemaMod / 2 + 1));
+				if (V.arcologies[0].FSSlimnessFoodLaw === 1) {
+					normBreasts = 500;
+					normButt = 3;
+				} else {
+					/* 'Expected' breast size based on weight for feminine-bodied slaves */
+					normBreasts = Math.trunc((100 + (slave.weight + 100) * 5 + 2 * slave.lactationAdaptation) * (0.85 + slave.hormoneBalance / 400) * gigantomastiaMod);
+					normButt = ((slave.weight + 100) * 0.025 * (0.9 + slave.hormoneBalance / 600) * (rearLipedemaMod / 2 + 1));
+				}
+
 			}
 
 			if (slave.hormoneBalance >= 350) {
-- 
GitLab


From 43365a6ac5c4688ff755b3dfea39c69d6e4a39b6 Mon Sep 17 00:00:00 2001
From: WhoreAnon <anon@anon.anon>
Date: Wed, 24 Aug 2022 21:16:57 +0900
Subject: [PATCH 24/29] separation of androgyny induced boobTarget and
 SlimnessFood target.

---
 src/endWeek/player/prPregnancy.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/endWeek/player/prPregnancy.js b/src/endWeek/player/prPregnancy.js
index 212582015eb..22a2a6714bb 100644
--- a/src/endWeek/player/prPregnancy.js
+++ b/src/endWeek/player/prPregnancy.js
@@ -272,7 +272,9 @@ App.EndWeek.Player.pregnancy = function(PC = V.PC) {
 		if (PC.geneMods.NCS === 1) {
 			// NCS: always working against secondary sexual characteristics even in pregnancies.
 			boobTarget = 0;
-		} else if (PC.geneticQuirks.androgyny === 2 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
+		} else if (PC.geneticQuirks.androgyny === 2) {
+			boobTarget = 400;
+		} else if (V.arcologies[0].FSSlimnessFoodLaw === 1){
 			boobTarget = 500;
 		} else if (PC.physicalAge >= 18) {
 			if (PC.pregType >= 50) {
-- 
GitLab


From 620b1dd0ceb6347867549bf2c92ad80d292f9821 Mon Sep 17 00:00:00 2001
From: WhoreAnon <anon@anon.anon>
Date: Wed, 24 Aug 2022 21:20:06 +0900
Subject: [PATCH 25/29] reverting custom idealAge variable target limit for
 immortality

---
 src/endWeek/saAgent.js | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/src/endWeek/saAgent.js b/src/endWeek/saAgent.js
index 389291beab3..eccaf99afcb 100644
--- a/src/endWeek/saAgent.js
+++ b/src/endWeek/saAgent.js
@@ -600,14 +600,10 @@ App.SlaveAssignment.agent = function(slave) {
 	}
 
 	if (slave.geneMods.immortality === 1) {
-		let idealAge = V.idealAge;
-		if (slave.geneMods.NCS !== 0) {
-			idealAge = 5;
-		}
-		if (slave.physicalAge > idealAge) {
+		if (slave.physicalAge > 26) {
 			slave.physicalAge--;
 		}
-		if (slave.visualAge > idealAge) {
+		if (slave.visualAge > 26) {
 			slave.visualAge--;
 		}
 	}
-- 
GitLab


From 6569b25e481c07ca29af34c00827602bb5f5005e Mon Sep 17 00:00:00 2001
From: WhoreAnon <anon@anon.anon>
Date: Wed, 24 Aug 2022 22:33:32 +0900
Subject: [PATCH 26/29] further modified to work in tandem with
 SlimnessEnthusiastLaw, preventing asset growth (other than pregnancy) beyond
 limits set in statsChecker.js>slimLawPass

---
 src/endWeek/player/prDiet.js     | 2 +-
 src/endWeek/saAgent.js           | 2 +-
 src/endWeek/saHormonesEffects.js | 4 ++--
 src/endWeek/saPregnancy.js       | 4 +++-
 4 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/endWeek/player/prDiet.js b/src/endWeek/player/prDiet.js
index b597b57253c..4df852ee733 100644
--- a/src/endWeek/player/prDiet.js
+++ b/src/endWeek/player/prDiet.js
@@ -844,7 +844,7 @@ App.EndWeek.Player.diet = function(PC = V.PC) {
 			roll = 80000;
 			target = Math.trunc(Math.clamp(weightMod * 1000 - (buttSize * 1000 - growthGoal) * 4, 0, 72000));
 		}
-		if (PC.geneMods.NCS === 1) {
+		if (PC.geneMods.NCS === 1 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
 			roll *= 2;
 		}
 		if (random(1, roll) <= target) {
diff --git a/src/endWeek/saAgent.js b/src/endWeek/saAgent.js
index eccaf99afcb..a97190b9d5d 100644
--- a/src/endWeek/saAgent.js
+++ b/src/endWeek/saAgent.js
@@ -198,7 +198,7 @@ App.SlaveAssignment.agent = function(slave) {
 			if (slave.geneMods.NCS === 1) {
 				/* Sort-of No-op, NCS prevents boob growth */
 			} else if (V.arcologies[0].FSSlimnessFoodLaw === 1) {
-				boobTarget = 500;
+				boobTarget = (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) ? 300 : 500;
 			} else if (slave.physicalAge >= 18) {
 				if (slave.pregType >= 50) {
 					boobTarget = 10000;
diff --git a/src/endWeek/saHormonesEffects.js b/src/endWeek/saHormonesEffects.js
index b4cef29e1fd..a423714ab62 100644
--- a/src/endWeek/saHormonesEffects.js
+++ b/src/endWeek/saHormonesEffects.js
@@ -319,8 +319,8 @@ App.SlaveAssignment.hormonesEffects = function saHormonesEffects(slave) {
 			let normButt = 0;
 			if (slave.hormoneBalance > 30 && slave.geneMods.NCS !== 1) {
 				if (V.arcologies[0].FSSlimnessFoodLaw === 1) {
-					normBreasts = 500;
-					normButt = 3;
+					normBreasts = (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) ? 300 : 500;
+					normButt = (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) ? 1 : 2;
 				} else {
 					/* 'Expected' breast size based on weight for feminine-bodied slaves */
 					normBreasts = Math.trunc((100 + (slave.weight + 100) * 5 + 2 * slave.lactationAdaptation) * (0.85 + slave.hormoneBalance / 400) * gigantomastiaMod);
diff --git a/src/endWeek/saPregnancy.js b/src/endWeek/saPregnancy.js
index 50575bcce00..492dde5d5e8 100644
--- a/src/endWeek/saPregnancy.js
+++ b/src/endWeek/saPregnancy.js
@@ -619,7 +619,9 @@ App.SlaveAssignment.pregnancy = function saPregnancy(slave) {
 			// NCS: always working against secondary sexual characteristics even in pregnancies.
 			boobTarget = 0;
 		} else if (slave.geneticQuirks.androgyny === 2) {
-			boobTarget = 400;
+			boobTarget = 500;
+		} else if (V.arcologies[0].FSSlimnessFoodLaw === 1) {
+			boobTarget = (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) ? 400 : 500; // pregnancy should expand breasts beyond ideal even if on slim food law
 		} else if (slave.physicalAge >= 18) {
 			if (slave.pregType >= 50) {
 				boobTarget = 10000;
-- 
GitLab


From c46ccfa33104bf70839e1e10a8347aa67b247020 Mon Sep 17 00:00:00 2001
From: WhoreAnon <anon@anon.anon>
Date: Wed, 24 Aug 2022 22:40:31 +0900
Subject: [PATCH 27/29] slight tweaks to conditions, tacking them on to NCS as
 behaves similarly in preventing growth

---
 src/endWeek/player/prDiet.js | 2 +-
 src/endWeek/saAgent.js       | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/endWeek/player/prDiet.js b/src/endWeek/player/prDiet.js
index 4df852ee733..06d619ffb61 100644
--- a/src/endWeek/player/prDiet.js
+++ b/src/endWeek/player/prDiet.js
@@ -827,7 +827,7 @@ App.EndWeek.Player.diet = function(PC = V.PC) {
 			roll = 75;
 			target = Math.trunc(Math.clamp(weightMod * 2 - (boobSize - growthGoal) / 20, 0, 68));
 		}
-		if (PC.geneMods.NCS === 1) {
+		if (PC.geneMods.NCS === 1 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
 			roll *= 2;
 		}
 		// PC food is not laced with hormones normally, so galactorrhea is not triggered here.
diff --git a/src/endWeek/saAgent.js b/src/endWeek/saAgent.js
index a97190b9d5d..288e516d57f 100644
--- a/src/endWeek/saAgent.js
+++ b/src/endWeek/saAgent.js
@@ -197,8 +197,8 @@ App.SlaveAssignment.agent = function(slave) {
 			let boobTarget = 0;
 			if (slave.geneMods.NCS === 1) {
 				/* Sort-of No-op, NCS prevents boob growth */
-			} else if (V.arcologies[0].FSSlimnessFoodLaw === 1) {
-				boobTarget = (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) ? 300 : 500;
+			} else if (V.arcologies[0].FSSlimnessFoodLaw === 1) { // overrides any age related limit
+				boobTarget = (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) ? 300 : 400;
 			} else if (slave.physicalAge >= 18) {
 				if (slave.pregType >= 50) {
 					boobTarget = 10000;
-- 
GitLab


From 7a263b7aef10010fbdd0812e7ab1493121bc66aa Mon Sep 17 00:00:00 2001
From: Whuuuahnon <14090-Whuuuahnon@users.noreply.gitgud.io>
Date: Wed, 24 Aug 2022 13:44:14 +0000
Subject: [PATCH 28/29] revert to original

---
 src/endWeek/saPregnancy.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/endWeek/saPregnancy.js b/src/endWeek/saPregnancy.js
index 492dde5d5e8..73c571be20d 100644
--- a/src/endWeek/saPregnancy.js
+++ b/src/endWeek/saPregnancy.js
@@ -619,7 +619,7 @@ App.SlaveAssignment.pregnancy = function saPregnancy(slave) {
 			// NCS: always working against secondary sexual characteristics even in pregnancies.
 			boobTarget = 0;
 		} else if (slave.geneticQuirks.androgyny === 2) {
-			boobTarget = 500;
+			boobTarget = 400;
 		} else if (V.arcologies[0].FSSlimnessFoodLaw === 1) {
 			boobTarget = (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) ? 400 : 500; // pregnancy should expand breasts beyond ideal even if on slim food law
 		} else if (slave.physicalAge >= 18) {
-- 
GitLab


From daf23c21c0452d7d2f3a7d4dc1a1578736510ed9 Mon Sep 17 00:00:00 2001
From: WhoreAnon <anon@anon.anon>
Date: Wed, 24 Aug 2022 22:56:59 +0900
Subject: [PATCH 29/29] bugfix

---
 js/003-data/policiesData.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/js/003-data/policiesData.js b/js/003-data/policiesData.js
index 87892b0a9d7..713583856a1 100644
--- a/js/003-data/policiesData.js
+++ b/js/003-data/policiesData.js
@@ -1600,7 +1600,7 @@ App.Data.Policies.Selection = {
 						V.arcologies[0].FSSlimnessEnthusiast > 20
 					);
 				},
-				note: `Slaves will no longer grow beyond the ideal amount of T&A, none! `
+				note: `Slaves will no longer grow beyond the ideal amount of T&A. `
 			}
 		],
 	},
-- 
GitLab