From 5559817f34ac183d51fa5353aaa31e6504f0988d Mon Sep 17 00:00:00 2001
From: Pregmodder <pregmodder@gmail.com>
Date: Sun, 10 Mar 2024 21:14:25 -0400
Subject: [PATCH] saDevotion work + apply intimidationDegree

---
 CHANGELOG.md                                  |   1 +
 src/endWeek/player/prPregnancy.js             |   2 +-
 src/endWeek/saDevotion.js                     | 207 +++++++++++++++---
 src/endWeek/saPleaseYou.js                    |   4 +-
 .../nonRandom/rival/pHostageAcquisition.js    |   2 +-
 src/js/storyJS.js                             |  34 ++-
 src/js/utilsSlaves.js                         |   3 +
 src/npc/generate/newSlaveIntro.js             |  10 +
 src/npc/interaction/fFeelings.js              |   1 +
 src/player/desc/pLongCrotch.js                |   2 +-
 src/player/desc/pNotesBelly.js                |   2 +-
 11 files changed, 225 insertions(+), 43 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 09e46ca5939..2a1d0c4f481 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 * control options for naturally occuring exotic hair colors
 * favorites system improvements
 * ability to export and import starting girls and starting settings
+* defiant slaves are more of a problem
 * fixes
 
 ## 0.10.7.1-4.0.0-alpha.29 - 2024-02-03
diff --git a/src/endWeek/player/prPregnancy.js b/src/endWeek/player/prPregnancy.js
index 8b41e04b3b4..2ae01a68820 100644
--- a/src/endWeek/player/prPregnancy.js
+++ b/src/endWeek/player/prPregnancy.js
@@ -114,7 +114,7 @@ App.EndWeek.Player.pregnancy = function(PC = V.PC) {
 			} else if (PC.preg >= PC.pregData.normalBirth) {
 				r.push(`Your pregnancy is nearing its end and you're <span class="libido inc">horny as hell.</span> Your hormones are out of control, driving you to fuck like a beast in heat despite your condition.`);
 				PC.energy += 4;
-			} else if (PC.preg > PC.pregData.normalBirth / 1.33) {
+			} else if (PC.preg > PC.pregData.normalBirth * .66) {
 				r.push(`With your pregnancy hormones raging, you <span class="libido inc">find your thoughts focusing on sex</span> more than usual.`);
 				PC.energy += 2;
 			} else if (PC.preg > PC.pregData.normalBirth / 2) {
diff --git a/src/endWeek/saDevotion.js b/src/endWeek/saDevotion.js
index 04badd5f505..cb6f1c675e2 100644
--- a/src/endWeek/saDevotion.js
+++ b/src/endWeek/saDevotion.js
@@ -13,7 +13,7 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 	} = getPronouns(slave);
 	const playerPronouns = getPronouns(V.PC);
 
-	const gettingPersonalAttention = V.personalAttention.task === PersonalAttention.TRAINING && V.personalAttention.slaves.some((s) => s.ID === slave.ID) && !onBedRest(V.PC, true);
+	const gettingPersonalAttention = getPersonalAttention(slave.ID, "training") && !onBedRest(V.PC, true);
 
 	if (slave.fetish === Fetish.MINDBROKEN) {
 		mindbreakDevotion(slave);
@@ -94,27 +94,66 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 	 */
 	function hostageDevotion(slave) {
 		if (slave.origin === "You were acquainted with $him before you were an arcology owner; your rival tried to use $him to manipulate you, but you rescued $him." && slave.newGamePlus === 0 && V.rival.FS.name !== "Slave Professionalism" && V.rival.FS.name !== "Intellectual Dependency") {
+			let hostageSatisfied = false;
+			if (V.rival.FS.name === "Eugenics" && ((slave.pregType > V.seeHyperPreg !== 1 ? 0 : 4 && slave.pregKnown) || slave.pregWeek < 0)) {
+				hostageSatisfied = true;
+			} else if (V.rival.FS.name === "Gender Radicalism" && slave.relationship === -3 && slave.trust > 50 && (slave.counter.anal === 0 || !canDoAnal(slave))) {
+				hostageSatisfied = true;
+			} else if (V.rival.FS.name === "Gender Fundamentalism" && (slave.toyHole === ToyHole.ASS || slave.toyHole === ToyHole.DICK)) {
+				hostageSatisfied = true;
+			} else if (V.rival.FS.name === "Body Purism" && slave.boobsImplant >= 30000 && slave.buttImplant > 7 && slave.lipsImplant >= 20) {
+				hostageSatisfied = true;
+			} else if (V.rival.FS.name === "Slimness Enthusiasm" && slave.boobs >= 50000 && slave.butt > 15) {
+				hostageSatisfied = true;
+			} else if (V.rival.FS.name === "Physical Idealism" && (((slave.diet === Diet.FATTEN || slave.diet === Diet.CALORIC || (slave.inflation > 1 && slave.inflationType === InflationLiquid.FOOD)) && slave.rules.living === "luxurious" && (slave.rules.rest === "permissive" || slave.rules.rest === "mandatory") && slave.rules.relationship === "permissive" && slave.rules.release.masturbation === 1 && slave.rules.release.slaves === 1) || (!onBedRest(V.PC, true) && ["ravish", "ravished"].includes(getPersonalAttentionType(slave.ID))))) { // not at all confusing
+				hostageSatisfied = true;
+			} else if (V.rival.FS.name === "Petite Admiration") {
+				if (V.rival.duration <= 20) {
+					if (V.PC.height >= slave.height + 30 && (slave.relationship === -3 || (!onBedRest(V.PC, true) && ["ravish", "ravished"].includes(getPersonalAttentionType(slave.ID))))) { // is 30 a good number?
+						hostageSatisfied = true;
+					}
+					// else clause for a lover later
+				} else {
+					// empty for now
+				}
+			} else if (V.rival.FS.name === "Statuesque Glorification") {
+				if (V.rival.duration <= 20) {
+					if (V.PC.height - 30 <= slave.height && (slave.relationship === -3 || (!onBedRest(V.PC, true) && ["ravish", "ravished"].includes(getPersonalAttentionType(slave.ID))))) { // is 30 a good number?
+						hostageSatisfied = true;
+					}
+					// else clause for a lover later
+				} else {
+					// empty for now
+				}
+			}
+			// TODO: "Youth Preferentialism" "Maturity Preferentialism" "Racial Subjugationism" "Cummunism"? Mostly just want their lover taken along, so that'd need to be set up in pHostageAcquisition.
+			// NOTE: "Eugenics" "Degradationism" "Transformation Fetishism" "Asset Expansionism" "Pastoralism" "Hedonistic Decadence" would want you to subject your other slaves to their whim.
 			if (V.rival.duration <= 10 || V.rival.FS.name === "Racial Supremacism" || V.rival.FS.name === "Paternalism") {
 				r.push(`You <span class="trust inc">saved ${slave.slaveName} from a living nightmare</span> under your rival's rule. ${He} <span class="devotion inc">tries ${his} best to adapt to ${his} savior's wishes.</span>`);
 				slave.devotion += 10;
 				slave.trust += 10;
-			/* TODO: Setup setter code block. Already defined within js/003-Data/gameVariableData.js
-			} else if (V.rival.hostageState === 3) {
-				r.push(`Since you are <span class="trust inc">indulging</span> ${slave.slaveName}'s desires, ${he} <span class="devotion inc">likes you more.</span>`);
-				slave.devotion += 5;
+			} else if (hostageSatisfied) {
+				r.push(`Since you are <span class="trust inc">indulging</span> ${slave.slaveName}'s desires, ${he}`);
+				if (slave.devotion <= 10) {
+					r.push(`<span class="devotion inc">likes you more.</span>`);
+					slave.devotion += 5;
+				} else {
+					r.push(`is willing to tolerate your ownership over ${him}.`);
+				}
 				slave.trust += 5;
-			*/
-			} else if (V.rival.duration > 20 && slave.devotion < 5) {
+			} else if (V.rival.duration > 20 && slave.devotion <= 20) {
 				if (gettingPersonalAttention) {
-					r.push(`You took everything from ${slave.slaveName} and <span class="devotion dec">${he} hates you for it.</span> Since you won't give ${him} what ${he} wants, ${he} <span class="trust dec">refuses to trust you.</span> Since you are putting such a personal touch into ${his} care, ${he} can't find it in ${him} to rebel as strongly.`);
+					r.push(`You took everything from ${slave.slaveName} and <span class="devotion dec">${he} hates you for it.</span> Since you won't give ${him} what ${he} wants, ${he} <span class="defiant inc">continues to defy you.</span> Since you are putting such a personal touch into ${his} care, ${he} can't find it in ${him} to rebel as strongly.`);
 					slave.devotion -= 5;
-					slave.trust -= 5;
+					slave.trust += 5;
 				} else {
-					r.push(`You took everything from ${slave.slaveName} and <span class="devotion dec">${he} hates you for it.</span> Since you won't give ${him} what ${he} wants, ${he} <span class="trust dec">refuses to trust you at all.</span>`);
+					r.push(`You took everything from ${slave.slaveName} and <span class="devotion dec">${he} hates you for it.</span> Since you won't give ${him} what ${he} wants, ${he} <span class="defiant inc">continues to defy you</span> no matter the repercussions.`);
 					slave.devotion -= 25;
-					slave.trust -= 25;
+					slave.trust += 25;
 				}
-			} else if (V.rival.duration > 10 && slave.devotion < 5) {
+				// TODO: Add undermining if unbroken. Harassment of slaves, destruction of property, insulting citizens, etc. Vignettes might be ideal for this, sans slave harassment?
+				// slave harassment will go under saRelationships.
+			} else if (V.rival.duration > 10 && slave.devotion <= 20) {
 				if (gettingPersonalAttention) {
 					r.push(`${He} is <span class="trust dec">horrified by you.</span> Your rival taught ${him} a great deal about slave life in your arcology and indulged ${his} deepest fantasies. ${slave.slaveName} considers being your pet <span class="devotion dec">a fate worse than death.</span> Since you are putting such a personal touch into ${his} care, maybe you aren't the monster ${he} thought you were. ${He} can't find it in ${him} to hate and fear you as much.`);
 					slave.devotion -= 3;
@@ -133,7 +172,7 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 	 *
 	 */
 	function playerPregnancyThoughts(slave) {
-		if (PC.preg >= 20 || (PC.preg >= 16 && PC.career === "escort")) { // switch to .belly
+		if (PC.preg > PC.pregData.normalBirth * .66) {
 			if (slave.devotion > 60) {
 				if (PC.pregMood === 2) {
 					r.push(`${He} is devoted to you and does ${his} best to satisfy your demanding, hormone driven libido, no matter what you want from ${him}. ${His} efforts to give ${himself} you to <span class="devotion inc">further ${his} submission</span> to you.`);
@@ -158,27 +197,60 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 					slave.devotion -= 3;
 				}
 			}
-		}
-		if (canPenetrate(slave) && PC.preg >= 18) {
-			if (PC.pregMood === 2) {
-				seX(PC, "vaginal", slave, "penetrative", 7);
-			} else {
-				seX(PC, "vaginal", slave, "penetrative", 3);
+			if (canPenetrate(slave) && PC.vagina > 0 && random(20, 99) < PC.energy) {
+				r.push(`Sometimes your cravings are too overpowering and ${he} finds ${himself} ordered to fuck you on the spot,`);
+				if ((slave.rules.release.master === 1 && slave.trust >= -20) || disobedience(slave) > random(0, 99)) {
+					if (slave.rules.release.master === 1 && slave.trust >= -20) {
+						r.push(`which ${he} dutifully performs`);
+					} else {
+						r.push(`which ${he} eagerly does`);
+					}
+					if (PC.pregMood === 2) {
+						r.push(`performs, even if "once" quickly becomes "more".`);
+						seX(PC, "vaginal", slave, "penetrative", 3);
+						PC.deferredNeed -= 10;
+					} else {
+						r.push(`performs.`);
+						seX(PC, "vaginal", slave, "penetrative", 1);
+						PC.deferredNeed -= 5;
+					}
+					tryKnockMeUp(PC, 2, 0, slave); // for superfetation shenanigans
+				} else {
+					if (slave.rules.release.master === 1 && slave.trust < -20) {
+						r.push(`but ${he} finds ${himself} <span class="devotion dec">humiliated</span> when ${he} fails to get it up for you.`);
+						slave.devotion -= 2;
+					} else {
+						r.push(`but ${he} doesn't dare to break the rules you've given ${him}.`);
+					}
+				}
 			}
 		}
-
-		if (slave.counter.PCKnockedUp > 0 && slave.devotion < -20) {
+		if (slave.counter.PCKnockedUp > 0) {
 			const pregCountFactor = (slave.counter.PCKnockedUp * 5);
-			r.push(`${He} got you pregnant`);
-			if (slave.counter.PCKnockedUp > 1) {
-				r.push(`more than once`);
-			}
-			r.push(`and ${he} knows it. This is a <span class="devotion dec">huge boost</span> to ${his} ego and gives ${him} a slight edge on you.`);
-			slave.devotion -= pregCountFactor;
-			if (slave.counter.PCChildrenFathered > 0) {
-				r.push(`Even better; you gave birth to ${his} child${slave.counter.PCChildrenFathered > 1 ? "ren" : ""}. To ${him}, ${he} is the dominant force and you are just a bitch to be bred. ${He} could create a scandal if ${he} started running ${his} mouth, something ${he} lords over you every chance ${he} gets under the assumption that <span class="trust inc">you'll try to appease ${him} to keep ${him} quiet.</span>`);
-				slave.devotion -= (5 + pregCountFactor);
-				slave.trust += (5 + pregCountFactor);
+			if ((slave.devotion < -20) || (slave.devotion < -20 && slave.trust > 20)) {
+				r.push(`${He} got you pregnant`);
+				if (slave.counter.PCKnockedUp > 1) {
+					r.push(`more than once`);
+				}
+				r.push(`and ${he} knows it. This is a <span class="devotion dec">huge boost to ${his} ego</span> and gives ${him} a slight edge on you.`);
+				slave.devotion -= pregCountFactor;
+				if (slave.counter.PCChildrenFathered > 0) {
+					r.push(`Even better; you gave birth to ${his} child${slave.counter.PCChildrenFathered > 1 ? "ren" : ""}. To ${him}, ${he} is the dominant force and you are just a bitch to be bred. ${He} could create a scandal if ${he} started running ${his} mouth, something ${he} lords over you every chance ${he} gets under the assumption that <span class="defiant inc">you'll try to appease ${him} to keep ${him} quiet.</span>`);
+					slave.devotion -= (5 + pregCountFactor);
+					slave.trust += (5 + pregCountFactor);
+				}
+			} else if (slave.devotion > 20 && slave.trust > 50 && PC.pregSource === slave.ID) {
+				r.push(`${He} knocked you up`);
+				if (slave.counter.PCKnockedUp > 1) {
+					r.push(r.pop() + ",");
+					r.push(`more than once,`);
+				}
+				r.push(`and you've chosen to keep ${his} child${PC.pregType > 1 ? "ren" : ""}. This is thrilling for ${him}, since ${he} must hold <span class="trust inc">some value</span> to you. Personally, you could do with ${him} being a little less overprotective of you.`);
+				slave.trust += pregCountFactor;
+				if (slave.counter.PCChildrenFathered > 0) {
+					r.push(`Since you've beared child${slave.counter.PCChildrenFathered > 1 ? "ren" : ""} for ${him} already, you've created a <span class="devotion inc">lasting bound</span> with ${him}. You may not see ${him} as your lover, but your actions have solidified it as such, and ${he} is more than happy to fulfill any desires ${his} mate may have.`);
+					slave.devotion += (5 + pregCountFactor);
+				}
 			}
 		}
 	}
@@ -188,6 +260,19 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 	 *
 	 */
 	function slaveryResistance(slave) {
+		if (slave.devotion <= 20) {
+			const intimidated = intimidationDegree(slave, PC);
+			if (intimidated >= 5) {
+				r.push(`${He} finds you extremely intimidating and can't help but <span class="trust dec">involuntarily cower</span> when you are near.`);
+			} else if (intimidated > 0) {
+				r.push(`${He} finds you intimidating, putting ${him} <span class="trust dec">on edge</span> around you.`);
+			} else if (intimidated <= 5) {
+				r.push(`${He} finds you completely benign and <span class="trust dec">feels little threat</span> from you.`);
+			} else if (intimidated < 0) {
+				r.push(`${He} doesn't find you very intimidating, allowing ${him} <span class="trust inc">to relax</span> around you.`);
+			}
+			slave.trust += 1 * intimidated;
+		}
 		if (slave.devotion <= 20 && slave.devotion >= -50) {
 			if (slave.trust > 20 && slave.devotion <= -20) {
 				r.push(`${slave.slaveName} does not like you and believes that you will not punish ${him} severely; ${his} <span class="devotion dec">regard for you is severely reduced</span> by this lack of respect.`);
@@ -783,9 +868,56 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 				}
 			}
 		}
+		if (PC.degeneracy > 2) {
+			if ((canPenetrate(slave) || slave.clit >= 3) && V.policies.sexualOpenness === 0 && PC.degeneracy > 2) {
+				if (slave.toyHole !== ToyHole.dick && slave.skill.penetrative > 60) {
+					r.push(`There are rumors about you enjoy taking it from slaves and`);
+					if (slave.devotion < -50) {
+						r.push(r.pop() + ",");
+						r.push(`since ${he} is aware of ${his} skill at fucking, ${he} hopes that at some point <span class="defiant inc">you will submit to ${his} ${slave.clit >= 3 ? "clit" : "dick"}</span> and allow ${him} to <span class="devotion dec">vent ${his} anger by ${PC.vagina === -1 ? "buggering" : "screwing"} you mercilessly.</span>`);
+						slave.devotion -= 5;
+						slave.trust += 5;
+					} else if (slave.devotion < 20 && slave.trust > 20) {
+						r.push(`${he} is certain that at some point <span class="trust inc">you will come to ${him} for the fucking of a lifetime.</span>`);
+						slave.trust += 5;
+					} else if (slave.trust < -20) {
+						r.push(`${he} is <span class="trust dec">terrified</span> that at some point you will decide to abuse ${his} penis because of ${his} penetrative skill.`);
+						slave.trust -= 2;
+					} else if (slave.devotion > 95) {
+						r.push(r.pop() + ",");
+						r.push(`although you aren't doing it with ${him}, ${he} worships you anyway.`);
+					} else if (slave.devotion <= 20) {
+						r.push(`<span class="trust inc">${he} is relieved</span> that you haven't choosen ${him} to be your sex toy.`);
+						slave.trust++;
+					} else {
+						r.push(`${he} doesn't understand <span class="devotion dec">why you don't let ${him} ${PC.vagina === -1 ? "sodomize" : "fuck"} you</span> too.`);
+						slave.devotion -= 2;
+					}
+				} else if (slave.toyHole === ToyHole.DICK) {
+					if (slave.devotion > 95 && slave.trust > 50) {
+						r.push(`<span class="trust dec">${He} feels guilty</span> over potentially being the cause of the rumors circling about you.`);
+						slave.trust -= 5;
+					} else if (slave.devotion < -50) {
+						r.push(`${He} considers <span class="trust inc">you ${his} bitch</span> and <span class="devotion dec">believes you deserve the rumors circling about you.</span>`);
+						slave.trust += 5;
+						slave.devotion -= 5;
+					} else if (slave.devotion < -20 && slave.trust > 20) {
+						r.push(`${He} just loves <span class="trust inc">you submiting to ${his} ${slave.clit >= 3 ? "clit" : "dick"}</span> and <span class="devotion dec">savors being the source of some of the rumors</span> about you.`);
+						slave.trust += 2;
+						slave.devotion -= 2;
+					} else if (slave.trust < 20) {
+						r.push(`${He} is <span class="trust dec">worried</span> that you will blame ${him} for the rumors surrounding you.`);
+						slave.trust -= 2;
+					} else {
+						r.push(`${He} pretends not to know anything about the rumors circling you, because <span class="trust inc">${he} is proud</span> to be allowed to penetrate you.`);
+						slave.trust += 2;
+					}
+				}
+			}
+		}
 		if (V.rapedThisWeek) {
 			r.push(`Some of your slaves whisper among themselves that you have been raped.`);
-			if (slave.devotion <= 20) {
+			if (slave.devotion <= -20) {
 				if (slave.fetish === Fetish.PREGNANCY && canImpreg(V.PC, slave)) {
 					r.push(`${He} daydreams about being able to do it ${himself} and <span class="trust inc">put ${slave.counter.PCKnockedUp ? "another" : "a"} bastard in your womb.</span>`);
 				} else if (slave.fetish === Fetish.DOM || slave.fetish === Fetish.SADIST) {
@@ -794,7 +926,7 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 					r.push(`${He} feels more <span class="trust inc">encouraged to challenge you</span> if given the opportunity.`);
 				}
 				slave.trust += 10;
-			} else if (slave.devotion <= 60) {
+			} else if (slave.devotion <= 20) {
 				r.push(`<span class="trust inc">${His} confidence increases</span> because ${he} thinks <span class="devotion dec">${he} can take advantage of your weakness.</span>`);
 				slave.devotion -= 5;
 				slave.trust +=5;
@@ -803,7 +935,8 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 				slave.devotion -=5;
 				slave.trust -=5;
 			} else {
-				r.push(`${He} knows well what it is to be raped and <span class="devotion inc">${he} empathizes with you.</span>`);
+				r.push(`${He} knows well what it is to be assaulted and <span class="devotion inc">${he} empathizes with you.</span>`);
+				slave.devotion++;
 			}
 		}
 	}
@@ -954,7 +1087,9 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 			r.push(`Any natural doubts ${he} has are overcome by ${his} conditioning in the incubation facility; ${he} cannot resist trusting ${his} owner.`);
 		} else if (slave.trust >= trustCap) {
 			if (slave.trust >= -20) {
-				if (V.arcologies[0].FSChattelReligionist >= random(1, 100)) {
+				if (slave.devotion < -20 && slave.trust > 20) {
+					r.push(`Any doubts ${he} harbors are overcome by ${his} faith in ${himself}, and ${he} decides to deem you toothless.`);
+				} else if (V.arcologies[0].FSChattelReligionist >= random(1, 100)) {
 					r.push(`Any natural doubts ${he} harbors are overcome by ${his} belief in Chattel Religionism, and ${he} does not resist ${his} progress down the path towards total trust in you.`);
 				} else if (gettingPersonalAttention) {
 					r.push(`${He} gained so much trust in you this week that ${his} natural reaction is to doubt ${himself}, but since you're giving ${him} personal attention, ${he} decides to trust ${his} understanding of your will.`);
@@ -1004,7 +1139,7 @@ App.SlaveAssignment.devotion = function saDevotion(slave) {
 			if (slave.trust > 100) {
 				if (slave.devotion < 100 && slave.devotion > 20) {
 					slave.devotion += Math.trunc(slave.trust - 100);
-				} else if (slave.devotion < -50) {
+				} else if (slave.devotion < -20) {
 					r.push(`${His} blatant disregard for your rule <span class="reputation dec">damages your reputation.</span>`);
 					repX(-30 * (slave.trust - 100), "slavesViewOfPC", slave);
 				} else if (slave.energy <= 50 && App.Utils.sexAllowed(slave, PC)) {
diff --git a/src/endWeek/saPleaseYou.js b/src/endWeek/saPleaseYou.js
index 87f5b3b9270..de66684232b 100644
--- a/src/endWeek/saPleaseYou.js
+++ b/src/endWeek/saPleaseYou.js
@@ -2281,7 +2281,7 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 						r.push(`Unfortunately, you wanted more from ${him} than ${his} body could give, rendering ${excessSex > 20 ? " a lot" : "some"} of your attempts to entice ${him} ineffective.`);
 					}
 				}
-			} else if (V.PC.preg >= 24 && V.PC.pregMood === 1) {
+			} else if (PC.preg > PC.pregData.normalBirth * .66 && V.PC.pregMood === 1) {
 				r.push(`${He} spends the week`);
 				if (slave.trust < -20) {
 					r.push(`cautiously fucking you in the missionary position. It takes a gentle touch to let ${him} know it's safe to get hard, but after that ${he} knows what to do.`);
@@ -2412,7 +2412,7 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 						r.push(`Unfortunately for you, you wanted more from ${him} than ${his} body could give; ${excessSex > 20 ? "far more than you'd like," : "every so often"} you discover that ${he} can't get hard for you. You reassure ${him} that ${he}'s not in trouble and that you can wait for next time as long as ${he} spends a moment cuddling with you.`);
 					}
 				}
-			} else if (V.PC.preg >= 24 && V.PC.pregMood === 2) {
+			} else if (PC.preg > PC.pregData.normalBirth * .66 && V.PC.pregMood === 2) {
 				r.push(`${He} spends the week`);
 				if (slave.trust < -20) {
 					r.push(`in fear under your gravid bulk as you forcibly ride ${his} dick in a futile attempt to cool your raging hormones.`);
diff --git a/src/events/nonRandom/rival/pHostageAcquisition.js b/src/events/nonRandom/rival/pHostageAcquisition.js
index a6e72c9fec4..a0db2430a3b 100644
--- a/src/events/nonRandom/rival/pHostageAcquisition.js
+++ b/src/events/nonRandom/rival/pHostageAcquisition.js
@@ -519,7 +519,7 @@ App.Events.pHostageAcquisition = class pHostageAcquisition extends App.Events.Ba
 						setHealth(V.hostage, -10, 25, Math.max(V.hostage.health.longDamage, 25), 1, 90);
 					}
 				} else if (V.rival.duration <= 20) {
-					r.push(`Upon being placed in your office, ${V.hostage.slaveName} curls into a fetal position and begins sobbing,. You help ${him} into your`);
+					r.push(`Upon being placed in your office, ${V.hostage.slaveName} curls into a fetal position and begins sobbing. You help ${him} into your`);
 					if (V.PC.boobs >= 650) {
 						r.push(`ample bust`);
 					} else {
diff --git a/src/js/storyJS.js b/src/js/storyJS.js
index c95836f604d..2483dabc72e 100644
--- a/src/js/storyJS.js
+++ b/src/js/storyJS.js
@@ -145,6 +145,38 @@ globalThis.canFemImpreg = function(slave1, slave2) {
 	}
 };
 
+/** assuming slave1 is fertile, could slave2 impregnate slave1?
+ * slave2 must have balls with compatible sperm;
+ * a special function intended for nulls intent on fathering children;
+ * @param {FC.HumanState} slave1
+ * @param {FC.HumanState} slave2
+ * @returns {boolean}
+ */
+globalThis.canNullImpreg = function(slave1, slave2) { // DO NOT USE YET!
+	if (!slave1 || !slave2) {
+		return null;
+	} else if (slave2.balls < 1) {
+		return false;
+	} else if (slave2.chastityVagina === 1) {
+		return false;
+	} else if (slave2.pubertyXY === 0) {
+		/* pregmod start */
+		return false;
+	} else if (slave2.vasectomy === 1) {
+		return false;
+	} else if (!canBreed(slave1, slave2)) {
+		return false; /* pregmod end */
+	} else if (!canGetPregnant(slave1)) {
+		/* includes chastity checks */
+		return false;
+	/* } else if ((slave2.chastityAnus !== 0 && slave2.anus > 0 && slave2.prostate > 0) || (slave2.prostateImplant === "stimulator")) {
+		return false;
+	*/
+	} else {
+		return true;
+	}
+};
+
 /**
  * The amount of milk a slave produces in liters/week
  * @param {FC.HumanState} slave
@@ -489,7 +521,7 @@ globalThis.overpowerCheck = function(slave, PC) {
  * @param {FC.HumanState} intimidater
  * @returns {number}
  */
-globalThis.intimidationDegree = function(intimidatee, intimidater) { // TODO: this goes in saDevotion. MAKE SURE YOU PUT IT THERE.
+globalThis.intimidationDegree = function(intimidatee, intimidater) {
 	let degree = 0;
 
 	if (intimidater.ID === -1) {
diff --git a/src/js/utilsSlaves.js b/src/js/utilsSlaves.js
index 27c947c19c7..e59bca5bc65 100644
--- a/src/js/utilsSlaves.js
+++ b/src/js/utilsSlaves.js
@@ -13,6 +13,9 @@ globalThis.haremLength = function() {
 globalThis.fuckSlavesLength = function() {
 	return V.slaves.filter(s => [Job.FUCKTOY, Job.MASTERSUITE, Job.CONCUBINE].includes(s.assignment) && s.rules.release.master !== 0).length;
 };
+globalThis.servantsLength = function() {
+	return V.slaves.filter(s => [Job.HOUSE, Job.QUARTER].includes(s.assignment)).length;
+};
 
 globalThis.getRieEligibleSlaves = function() {
 	return V.slaves.filter(s => s.fuckdoll === 0 &&
diff --git a/src/npc/generate/newSlaveIntro.js b/src/npc/generate/newSlaveIntro.js
index 4d88f6a6c24..688644b4086 100644
--- a/src/npc/generate/newSlaveIntro.js
+++ b/src/npc/generate/newSlaveIntro.js
@@ -497,6 +497,16 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 			slave.trust -= 10;
 		}
 
+		if (canSee(slave)) {
+			const intimidated = intimidationDegree(slave, PC);
+			if (intimidated > 0) {
+				r.push(`${He} finds your appearance intimidating, putting ${him} <span class="trust dec">on edge</span> around you.`);
+			} else if (intimidated < 0) {
+				r.push(`You don't look very intimidating, encouraging ${him} <span class="trust inc">to lower ${his} guard.</span>`);
+			}
+			slave.trust += 2 * intimidated;
+		}
+
 		if (PC.rumor === "force") {
 			if (slave.devotion <= 20) {
 				if (slave.trust > 0) {
diff --git a/src/npc/interaction/fFeelings.js b/src/npc/interaction/fFeelings.js
index e38e14c8af9..9bfaf2c260c 100644
--- a/src/npc/interaction/fFeelings.js
+++ b/src/npc/interaction/fFeelings.js
@@ -1,5 +1,6 @@
 // cSpell:ignore fat-assed, kissy
 // TODO: expand this to have slaves with low devotion / trust speak more
+// TODO: give hostage slave her opinions about her desires, state, and your other slaves
 
 /**
  *
diff --git a/src/player/desc/pLongCrotch.js b/src/player/desc/pLongCrotch.js
index 6a28122f384..3816f13e55e 100644
--- a/src/player/desc/pLongCrotch.js
+++ b/src/player/desc/pLongCrotch.js
@@ -5,7 +5,7 @@ App.Desc.Player.crotch = function(PC = V.PC) {
 	const hands = hasBothArms(PC) ? "hands" : "hand";
 	const isAroused = isHorny(PC);
 	const virile = isVirile(PC);
-	const cumTotal = (cumAmount(PC) / 70) || 0;
+	const cumTotal = cumLoad(PC);
 	const foreskinRatio = (PC.foreskin - PC.dick);
 	const bigBelly = (PC.belly >= 100000 || PC.weight > 130);
 	let useConjunction = false;
diff --git a/src/player/desc/pNotesBelly.js b/src/player/desc/pNotesBelly.js
index 8453efcfff9..363eff70908 100644
--- a/src/player/desc/pNotesBelly.js
+++ b/src/player/desc/pNotesBelly.js
@@ -404,7 +404,7 @@ App.Desc.Player.pNotesBelly = function(PC = V.PC) {
 				} else if (PC.pregMood === 2) {
 					r.push(`You don't let your pregnancy get in the way when it comes to sex; you make sure your slaves learn new positions to accommodate your bulk.`);
 				}
-			} else if (PC.preg >= 28) {
+			} else if (PC.preg >= 28) { // PC.preg > PC.pregData.normalBirth * .66
 				if (PC.pregMood === 1) {
 					r.push(`You catch yourself babying your slaves from time to time.`);
 				} else if (PC.pregMood === 2) {
-- 
GitLab