From a4c6ff3de037f92cb566a620889cf51ffe399bfe Mon Sep 17 00:00:00 2001
From: Pregmodder <pregmodder@gmail.com>
Date: Wed, 8 May 2024 23:42:25 -0400
Subject: [PATCH] Manually merge "use mouth instead of throat for small dicks"

---
 CHANGELOG.md                                  |  8 ++++
 src/Mods/Catmod/events/CMRESS/catLove.js      | 23 +++++++++-
 src/Mods/Catmod/events/CMRESS/catPresent.js   | 18 +++++++-
 src/Mods/Catmod/events/CMRESS/catWorship.js   |  6 ++-
 src/Mods/Catmod/events/CMRESS/spoiledCat.js   | 22 +++++++++-
 .../SpecialForce/events/SpecialForceIntro.js  |  2 +-
 src/endWeek/reports/personalAttention.js      |  2 +-
 src/endWeek/saPleaseYou.js                    | 44 ++++++++++---------
 src/endWeek/saServeYourOtherSlaves.js         |  4 +-
 src/events/PESS/pessHeadgirlDickgirl.js       |  2 +-
 src/events/PETS/petsStewardessBeating.js      |  4 +-
 src/js/statsChecker/statsChecker.js           | 21 +++++++++
 12 files changed, 125 insertions(+), 31 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0b845f1027f..9cdaf652f61 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,12 +6,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 ## Unreleased
 
+* farmyard improvements and fixes
 * added the smart strap-on, a tool that maximizes femPC's ability to deal with need
+* added skill based recruiter specializations
 * added a new gender fundamentalist recFS event
 * added several new coursing hares
 * coursing rep slightly rebalanced (less upfront, more on win)
 * pregnancy report improvements
+* rework selling slaves to the Peacekeepers
+* rework player degeneracy into rumors
+* split dick and clit drugs apart
+* better defined what "age of  majority" is, and how it differs from "age of enslavement".
+* collapsed SlaveState, PlayerState, etc into HumanState (everything still ends up the same, just is built more logically)
 * AI related things, most notably the dressing room
+* ability to save to clipboard for you mobile players
 * fixes
 
 ## 0.10.7.1-4.0.0-alpha.31 - 2024-04-08
diff --git a/src/Mods/Catmod/events/CMRESS/catLove.js b/src/Mods/Catmod/events/CMRESS/catLove.js
index 944c81f2bc8..e62cda70091 100644
--- a/src/Mods/Catmod/events/CMRESS/catLove.js
+++ b/src/Mods/Catmod/events/CMRESS/catLove.js
@@ -108,10 +108,29 @@ App.Events.CMRESSCatLove = class CMRESSCatLove extends App.Events.BaseEvent {
 			if (eventSlave.sexualFlaw !== "hates oral") {
 				t.push(`The cat${girl} flashes you a smile full of sharp feline fangs that makes you rethink your decision for a brief moment before ${he} squats down, pressing out ${his} ass far enough to give you a good view of those furry cheeks as ${he} works your pants down, and`);
 				if (eventSlave.skill.oral >= 80) {
-					t.push(`${PC.dick !== 0 ? `gives you a magnificent, loving throatjob, taking your cock as far as it can bury itself in ${his} throat while working every last drop of cum out from your balls with ${his} soft, furry hands,` : `eats you out skillfully and intensely, working ${his} rough cat tongue deep into your pussy until ${he} brings you to a shuddering orgasm,`}`);
+					if (PC.dick !== 0) {
+						t.push(`gives you a magnificent, loving`);
+						if (canPenetrateThroat(V.PC)) {
+							t.push(`throatjob, taking your cock as far as it can bury itself in ${his} throat`);
+						} else {
+							t.push(`suck, teasing the entirety of your cock with ${his} tongue`);
+						}
+						t.push(`while working every last drop of cum out from your balls with ${his} soft, furry hands,`);
+					} else {
+						t.push(`eats you out skillfully and intensely, working ${his} rough cat tongue deep into your pussy until ${he} brings you to a shuddering orgasm,`);
+					}
 					t.push(`<span class="devotion inc">pointy ears twitching happily atop ${his} head the entire time.</span>`);
 				} else if (eventSlave.skill.oral > 40) {
-					t.push(`${PC.dick !== 0 ? `gives you a skillful blowjob, carefully avoiding scratching your dick on ${his} fangs as ${he} soon brings you to a powerful orgasm down ${his} throat,` : `tonguefucks you hard, burying ${his} soft button nose against your clit as ${he} works out an orgasm from your pussy,`}`);
+					if (PC.dick !== 0) {
+						t.push(`gives you a skillful blowjob, carefully avoiding scratching your dick on ${his} fangs as ${he} soon`);
+						if (canPenetrateThroat(V.PC)) {
+							t.push(`brings you to a powerful orgasm down ${his} throat,`);
+						} else {
+							t.push(`fills ${his} mouth with your orgasm,`);
+						}
+					} else {
+						t.push(`tonguefucks you hard, burying ${his} soft button nose against your clit as ${he} works out an orgasm from your pussy,`);
+					}
 					t.push(`<span class="devotion inc">fluffy tail waggling behind ${him} the whole time almost doggishly.</span>`);
 				} else {
 					t.push(`${PC.dick !== 0 ? `does ${his} best to give you a good blowjob, mostly nervously trying to avoid cutting your dick on ${his} sharp fangs until ${his} warm, amateurish mouth finally coaxes an orgasm out of you,` : `eats you out amateurishly, ${his} rough cat tongue scratching your folds slightly as ${he} twists it around to eventually bring you to orgasm,`}`);
diff --git a/src/Mods/Catmod/events/CMRESS/catPresent.js b/src/Mods/Catmod/events/CMRESS/catPresent.js
index c12fa810130..1af627652d0 100644
--- a/src/Mods/Catmod/events/CMRESS/catPresent.js
+++ b/src/Mods/Catmod/events/CMRESS/catPresent.js
@@ -147,7 +147,23 @@ App.Events.CMRESSCatPresent = class CMRESSCatPresent extends App.Events.BaseEven
 			if (eventSlave.sexualFlaw !== "hates oral") {
 				t.push(`The cat${girl} teases and bristles against you for a good minute as you get back to work before finally pulling your bottoms out of the way, doing ${his} best to disrupt your focus from the business deals in front of you as ${he}`);
 				if (eventSlave.skill.oral >= 60) {
-					t.push(`${PC.dick !== 0 ? `blows you nonstop while skillfully avoiding pricking you with ${his} fangs, working what must be a half-dozen loads from your dick throughout the workday. Your cock is basically holstered in ${his} throat as you work, and ${his} skillful attention to your nuts coaxes you back to action within minutes of blowing one load down ${his} throat,` : `tonguefucks you again and again, slaving away at your pussy to bring you to distractingly squirt and sputter against ${his} fuzzy face countless times while you try to work,`} the soft fur feeling divine between your thighs the whole time.`);
+					if (PC.dick !== 0) {
+						t.push(`blows you nonstop while skillfully avoiding pricking you with ${his} fangs, working what must be a half-dozen loads from your dick throughout the workday. Your cock is basically`);
+						if (canPenetrateThroat(V.PC)) {
+							t.push(`holstered in ${his} throat`);
+						} else {
+							t.push(`locked in ${his} mouth`);
+						}
+						t.push(`as you work, and ${his} skillful attention to your nuts coaxes you back to action within minutes of`);
+						if (canPenetrateThroat(V.PC)) {
+							t.push(`blowing your load down ${his} throat,`);
+						} else {
+							t.push(`puffing ${his} cheeks out with your load,`);
+						}
+					} else {
+						t.push(`tonguefucks you again and again, slaving away at your pussy to bring you to distractingly squirt and sputter against ${his} fuzzy face countless times while you try to work,`);
+					}
+					t.push(`the soft fur feeling divine between your thighs the whole time.`);
 					t.push(`<span class="devotion inc">When ${he} finally comes up from under the desk, ${he} smiles broadly, having serviced you for most of the working day.</span>`);
 				} else {
 					t.push(`${PC.dick !== 0 ? `serves at the altar of your cock as best ${he} can, occasionally distracting you from the nonstop blowjob as ${his} sharp fangs prick your dick. Despite ${his} amateur efforts, ${he} gets multiple orgasms out of you over the course of the next few hours, blowing you with enthusiasm and energy if not skill.` : `eats you out amateurishly over the next few hours, ${his} rough cat tongue scratching your folds slightly as ${he} twists it around to eventually bring you to orgasm - and then another, and another. ${He} does ${his} best to serve your cunt, even with ${his} mediocre skills.`}`);
diff --git a/src/Mods/Catmod/events/CMRESS/catWorship.js b/src/Mods/Catmod/events/CMRESS/catWorship.js
index c56c3b6e944..e2ae78ce4d1 100644
--- a/src/Mods/Catmod/events/CMRESS/catWorship.js
+++ b/src/Mods/Catmod/events/CMRESS/catWorship.js
@@ -79,7 +79,11 @@ App.Events.CMRESSCatWorship = class CMRESSCatWorship extends App.Events.BaseEven
 			t = [];
 			t.push(`No reason to interrupt a good thing. You content yourself to lean back against the entrance to the showers and watch as ${eventSlave.slaveName} gets ${his} two little slaves to pay their respects to the feline form, the one in front `);
 			if (eventSlave.dick > 0) {
-				t.push(`throating ${himselfU} on cock`);
+				if (canPenetrateThroat(eventSlave)) {
+					t.push(`throating ${himselfU} on cock`);
+				} else {
+					t.push(`sucking ${his} cock`);
+				}
 			} else if (eventSlave.vagina > 0) {
 				t.push(`eating ${him} out with furry thighs locked against ${his} head`);
 			} else {
diff --git a/src/Mods/Catmod/events/CMRESS/spoiledCat.js b/src/Mods/Catmod/events/CMRESS/spoiledCat.js
index ea6161b1fb6..7845630c0af 100644
--- a/src/Mods/Catmod/events/CMRESS/spoiledCat.js
+++ b/src/Mods/Catmod/events/CMRESS/spoiledCat.js
@@ -81,7 +81,27 @@ App.Events.CMRESSSpoiledCat = class CMRESSSpoiledCat extends App.Events.BaseEven
 
 		function godMe() {
 			t = [];
-			t.push(`You call ${eventSlave.slaveName} into your office, and, without explanation, tell ${him} to get to work servicing your ${PC.dick !== 0 ? "cock" : "cunt"}. The catslave seems somewhat surprised, but doesn't protest, kneeling down and getting to work pulling your pants out of the way. When ${he}'s ${PC.dick !== 0 ? `managed to get your dick down ${his} throat,` : `gotten to work eating you out with ${his} rough cat tongue up your cunt,`} you inform ${him} that ${he}'s been acting more than a little smug recently, and that ${he} needed a little reminder of ${his} place. With one hand, you grab the cat${girl}'s soft hair and pull ${him} tightly forward,${PC.dick !== 0 ? `burying ${him} so deep onto your dick ${he} has to stretch ${his} jaw to avoid pricking you with ${his} fangs` : `flattening ${his} nose against your crotch with ${his} tongue buried deep into your pussy`}, forcing ${him} to look up at you with big, wide, stilted cat eyes, ${his} mouth dedicated to your genitals. You tell ${him} that no matter how much the public kisses ${his} ass, ${he}'ll always be a mewling little slave groveling under your ${PC.dick !== 0 ? "dick" : "pussy"}. The slave${girl} nods enthusiastically and you let go of ${his} head, letting ${him} finish you off with some <span class="devotion inc">intense oral.</span> For the rest of the week, the public continues to lavish attention and <span class ="green">love</span> onto the public-facing cat${girl}, but at the slightest gesture from you ${he} wiggles ${his} furry ass back in groveling, slavish devotion.`);
+			t.push(`You call ${eventSlave.slaveName} into your office, and, without explanation, tell ${him} to get to work servicing your ${PC.dick !== 0 ? "cock" : "cunt"}. The catslave seems somewhat surprised, but doesn't protest, kneeling down and getting to work pulling your pants out of the way. When ${he}'s`);
+			if (PC.dick !== 0) {
+				if (canPenetrateThroat(V.PC)) {
+					t.push(`managed to get your dick down ${his} throat,`);
+				} else {
+					t.push(`taken your dick into ${his} mouth,`);
+				}
+			} else {
+				t.push(`gotten to work eating you out with ${his} rough cat tongue up your cunt,`);
+			}
+			t.push(`you inform ${him} that ${he}'s been acting more than a little smug recently, and that ${he} needed a little reminder of ${his} place. With one hand, you grab the cat${girl}'s soft hair and pull ${him} tightly forward,`);
+			if (PC.dick !== 0) {
+				if (canPenetrateThroat(V.PC)) {
+					t.push(`burying ${him} so deep onto your dick ${he} has to stretch ${his} jaw to avoid pricking you with ${his} fangs,`);
+				} else {
+					t.push(`flattening ${his} nose against your crotch with ${his} tongue curled around your dick,`);
+				}
+			} else {
+				t.push(`flattening ${his} nose against your crotch with ${his} tongue buried deep into your pussy,`);
+			}
+			t.push(`forcing ${him} to look up at you with big, wide, stilted cat eyes, ${his} mouth dedicated to your genitals. You tell ${him} that no matter how much the public kisses ${his} ass, ${he}'ll always be a mewling little slave groveling under your ${PC.dick !== 0 ? "dick" : "pussy"}. The slave${girl} nods enthusiastically and you let go of ${his} head, letting ${him} finish you off with some <span class="devotion inc">intense oral.</span> For the rest of the week, the public continues to lavish attention and <span class ="green">love</span> onto the public-facing cat${girl}, but at the slightest gesture from you ${he} wiggles ${his} furry ass back in groveling, slavish devotion.`);
 			eventSlave.devotion += 15;
 			repX(400, "event", eventSlave);
 			return t;
diff --git a/src/Mods/SpecialForce/events/SpecialForceIntro.js b/src/Mods/SpecialForce/events/SpecialForceIntro.js
index d3f890cf639..e077b4c0b90 100644
--- a/src/Mods/SpecialForce/events/SpecialForceIntro.js
+++ b/src/Mods/SpecialForce/events/SpecialForceIntro.js
@@ -178,7 +178,7 @@ App.Events.SecurityForceProposal = class SecurityForceProposal extends App.Event
 								r = [];
 								r.push(`You feel your climax approaching and hold up a finger. The merc pauses while you grab the slave's head`);
 								if (V.PC.dick > 0) {
-									r.push(`then force your cock roughly down ${hisU} throat while you cum. ${HeU} swallows as much as ${heU} can before pulling`);
+									r.push(`then force your cock roughly ${canPenetrateThroat(V.PC) ? `down ${hisU} throat` : `into ${hisU} mouth`} while you cum. ${HeU} swallows as much as ${heU} can before pulling`);
 								} else {
 									r.push(`tightly with your thighs, pressing ${hisU} face tightly against your pussy as you cum. When you release ${himU}, ${heU} pulls`);
 								}
diff --git a/src/endWeek/reports/personalAttention.js b/src/endWeek/reports/personalAttention.js
index 8d0172728a8..69141e6a04f 100644
--- a/src/endWeek/reports/personalAttention.js
+++ b/src/endWeek/reports/personalAttention.js
@@ -834,7 +834,7 @@ App.PersonalAttention.slaveReport = function(slave) {
 				}
 			}
 			break;
-		case "soften sexual flaw":
+		case "soften sexual flaw": // TODO: Review for canPenetrateThroat(V.PC)
 			if (slave.sexualFlaw === SexualFlaw.NONE) {
 				r.push(`${slave.slaveName} got over ${his} sexual flaw without you,`);
 				coloredText = [];
diff --git a/src/endWeek/saPleaseYou.js b/src/endWeek/saPleaseYou.js
index 9316f9306a8..e17304e4b06 100644
--- a/src/endWeek/saPleaseYou.js
+++ b/src/endWeek/saPleaseYou.js
@@ -1250,7 +1250,7 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 				qualitySex = 1;
 			} else if (slave.trust < -20) {
 				r.push(`in terrified compliance with your use of ${his}`);
-				if (V.PC.dick !== 0 && canPenetrate(V.PC)) {
+				if (V.PC.dick !== 0 && canPenetrateThroat(V.PC)) {
 					r.push(`throat.`);
 				} else {
 					r.push(`mouth.`);
@@ -1258,7 +1258,7 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 				qualitySex -= 2;
 			} else if (slave.trust > 20 && slave.devotion <= 20) {
 				r.push(`defiantly attempting to make`);
-				if (V.PC.dick !== 0 && canPenetrate(V.PC)) {
+				if (V.PC.dick !== 0 && canPenetrateThroat(V.PC)) {
 					r.push(`throatfucking ${him}`);
 				} else if (nullPC) {
 					r.push(`making out with ${him}`);
@@ -1269,7 +1269,7 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 				qualitySex -= 10;
 			} else if (slave.devotion < -20) {
 				r.push(`struggling and gagging as you`);
-				if (V.PC.dick !== 0 && canPenetrate(V.PC)) {
+				if (V.PC.dick !== 0 && canPenetrateThroat(V.PC)) {
 					r.push(`throatfuck ${him}.`);
 				} else if (V.PC.dick !== 0) {
 					r.push(`stuff ${his} face.`);
@@ -2874,7 +2874,7 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 				} else {
 					r.push(`on occasion.`);
 				}
-				r.push(`${He} sometimes thrusts out of instinct, but you usually have to do all the work until ${he} unloads in ${slave.dick > 3 ? "your throat" : "your mouth"}${loadSize >= 250 ? " and fills your stomach" : ""}.`);
+				r.push(`${He} sometimes thrusts out of instinct, but you usually have to do all the work until ${he} unloads in ${canPenetrateThroat(slave) ? "your throat" : "your mouth"}${loadSize >= 250 ? " and fills your stomach" : ""}.`);
 				qualitySex = Math.min(Math.max(qualitySex, 7), penetrativeUse);
 				excessSex = penetrativeUse - qualitySex;
 				// cull excess if satisfied
@@ -3003,15 +3003,19 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 							r.push(`watching you stagger back with a belly full of ${his} cum`);
 						} else if (loadSize >= 250 && V.PC.bellySag > Math.trunc(loadSize / 100) && V.PC.weight <= 95) {
 							r.push(`seeing the little belly you sport after swallowing ${his} load`);
-						} else {
+						} else if (canPenetrateThroat(slave)) {
 							r.push(`getting to blow ${his} load down your throat`);
+						} else {
+							r.push(`getting to fill your mouth with ${his} load`);
 						}
-					} else {
+					} else if (canPenetrateThroat(slave)) {
 						r.push(`getting to blow ${his} load down your throat`);
+					} else {
+						r.push(`getting to fill your mouth with ${his} load`);
 					}
 					r.push(`<span class="devotion dec">builds ${his} confidence</span> and <span class="trust inc">alleviates some of the threat</span> you hold over ${him} as ${his} owner.`);
 					if (excessSex > 0) {
-						r.push(`${excessSex > 20 ? "Far too many times" : "Every so often"} you find ${him} trying to weasel out of getting blown by claiming ${he}'s 'had enough', so you remind ${him} of ${his} place by grabbing ${his} hips and deepthroating ${him}; you plan on draining every last drop out of ${him}, whether ${he} likes it or not. You leave ${him} <span class="trust inc">beyond satisfied,</span> if a little exhausted, to <span class="devotion inc">rethink how good ${he} actually has it.</span>`);
+						r.push(`${excessSex > 20 ? "Far too many times" : "Every so often"} you find ${him} trying to weasel out of getting blown by claiming ${he}'s 'had enough', so you remind ${him} of ${his} place by grabbing ${his} hips and ${canPenetrateThroat(slave) ? `deepthroating ${him}` : `sucking ${him} off`}; you plan on draining every last drop out of ${him}, whether ${he} likes it or not. You leave ${him} <span class="trust inc">beyond satisfied,</span> if a little exhausted, to <span class="devotion inc">rethink how good ${he} actually has it.</span>`);
 						slave.devotion += 2;
 						slave.trust += 1;
 					}
@@ -3042,7 +3046,7 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 						slave.devotion -= 1;
 						slave.trust += 3;
 					}
-					r.push(`with the promise that ${he}'ll be allowed to <span class="trust inc">unload ${his} semen down the throat of who ${he} hates most.</span>`);
+					r.push(`with the promise that ${he}'ll be allowed to <span class="trust inc">unload ${his} semen ${canPenetrateThroat(slave) ? `down the throat of who` : `into the ${playerPronouns.woman}`} ${he} hates most.</span>`);
 					if (excessSex > 0) {
 						r.push(`${excessSex > 20 ? "Far more than you'd like" : "Every so often"} you find that ${he} can't get it up anymore, but that doesn't stop you from sucking every last drop out of ${him}. ${He} ends ${his} days <span class="trust inc">more satisfied</span> than ${he} knew ${he} could be.`);
 						slave.trust += 2;
@@ -3630,16 +3634,16 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 			if (showExcessReport && slave.sexualQuirk !== SexualFlaw.GAGFUCK) {
 				r.push(`week, though ${his}`);
 				if (slave.nipples === NippleShape.FUCKABLE && (canPenetrate(V.PC) || V.PC.clit >= 3)) {
-					r.push(`throat and breasts get a little sore picking up the slack.`);
+					r.push(`${canPenetrateThroat(V.PC) ? `throat` : `mouth`} and breasts get a little sore picking up the slack.`);
 				} else {
-					r.push(`throat gets a little sore doing the work of three holes.`);
+					r.push(`${canPenetrateThroat(V.PC) ? `throat` : `mouth`} gets a little sore doing the work of three holes.`);
 				}
 			} else {
 				r.push(`week and takes it like a champ using ${his}`);
 				if (slave.nipples === NippleShape.FUCKABLE && (canPenetrate(V.PC) || V.PC.clit >= 3)) {
-					r.push(`throat and breasts`);
+					r.push(`${canPenetrateThroat(V.PC) ? `throat` : `mouth`} and breasts`);
 				} else {
-					r.push(`throat`);
+					r.push(`${canPenetrateThroat(V.PC) ? `throat` : `mouth`}`);
 				}
 				r.push(`to show you ${his} appreciation.`);
 			}
@@ -3654,28 +3658,28 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 			if (canDoAnal(slave) && slave.nipples === NippleShape.FUCKABLE && (canPenetrate(V.PC) || V.PC.clit >= 3)) {
 				r.push(`anus, nipples and mouth. ${He} is <span class="trust inc">duly grateful</span> you let ${him} keep ${his} innocence for another`);
 				if (showExcessReport) {
-					r.push(`week, though ${his} butt, boobs and throat get a little sore.`);
+					r.push(`week, though ${his} butt, boobs and ${canPenetrateThroat(V.PC) ? `throat` : `mouth`} get a little sore.`);
 				} else {
 					r.push(`week.`);
 				}
 			} else if (canDoAnal(slave)) {
 				r.push(`anus and mouth. ${He} is <span class="trust inc">duly grateful</span> you let ${him} keep ${his} innocence for another`);
 				if (showExcessReport) {
-					r.push(`week, though ${his} butt and throat get a little sore.`);
+					r.push(`week, though ${his} butt and ${canPenetrateThroat(V.PC) ? `throat` : `mouth`} get a little sore.`);
 				} else {
 					r.push(`week.`);
 				}
 			} else if (slave.nipples === NippleShape.FUCKABLE && (canPenetrate(V.PC) || V.PC.clit >= 3)) {
 				r.push(`nipples and mouth. ${He} is <span class="trust inc">duly grateful</span> you let ${him} keep ${his} innocence for another`);
 				if (showExcessReport && slave.sexualQuirk !== SexualFlaw.GAGFUCK) {
-					r.push(`week, though ${his} boobs and throat get a little sore.`);
+					r.push(`week, though ${his} boobs and ${canPenetrateThroat(V.PC) ? `throat` : `mouth`} get a little sore.`);
 				} else {
 					r.push(`week.`);
 				}
 			} else {
 				r.push(`mouth. ${He} is <span class="trust inc">duly grateful</span> you ${his} keep let ${him} innocence for another`);
 				if (showExcessReport && slave.sexualQuirk !== SexualFlaw.GAGFUCK) {
-					r.push(`week, though ${his} throat gets a little sore.`);
+					r.push(`week, though ${his} ${canPenetrateThroat(V.PC) ? `throat` : `mouth`} gets a little sore.`);
 				} else {
 					r.push(`week.`);
 				}
@@ -3691,28 +3695,28 @@ App.SlaveAssignment.pleaseYou = function saPleaseYou(slave) {
 			if (canDoVaginal(slave) && slave.nipples === NippleShape.FUCKABLE && (canPenetrate(V.PC) || V.PC.clit >= 3)) {
 				r.push(`pussy, nipples and mouth. ${He} is <span class="trust inc">duly grateful</span> you let ${him} put off taking it up the butt another`);
 				if (showExcessReport && slave.sexualQuirk !== SexualFlaw.GAGFUCK) {
-					r.push(`week, though ${his} boobs and throat get a little sore.`);
+					r.push(`week, though ${his} boobs and ${canPenetrateThroat(V.PC) ? `throat` : `mouth`} get a little sore.`);
 				} else {
 					r.push(`week.`);
 				}
 			} else if (canDoVaginal(slave)) {
 				r.push(`pussy and mouth. ${He} is <span class="trust inc">duly grateful</span> you let ${him} put off taking it up the butt another`);
 				if (showExcessReport && slave.sexualQuirk !== SexualFlaw.GAGFUCK) {
-					r.push(`week, though ${his} throat gets a little sore.`);
+					r.push(`week, though ${his} ${canPenetrateThroat(V.PC) ? `throat` : `mouth`} gets a little sore.`);
 				} else {
 					r.push(`week.`);
 				}
 			} else if (slave.nipples === NippleShape.FUCKABLE && (canPenetrate(V.PC) || V.PC.clit >= 3)) {
 				r.push(`nipples and mouth. ${He} is <span class="trust inc">duly grateful</span> you let ${him} put off taking it up the butt another`);
 				if (showExcessReport && slave.sexualQuirk !== SexualFlaw.GAGFUCK) {
-					r.push(`week, though ${his} boobs and throat get a little sore.`);
+					r.push(`week, though ${his} boobs and ${canPenetrateThroat(V.PC) ? `throat` : `mouth`} get a little sore.`);
 				} else {
 					r.push(`week.`);
 				}
 			} else {
 				r.push(`mouth. ${He} is <span class="trust inc">duly grateful</span> you let ${him} put off taking it up the butt another`);
 				if (showExcessReport && slave.sexualQuirk !== SexualFlaw.GAGFUCK) {
-					r.push(`week, though ${his} throat gets a little sore.`);
+					r.push(`week, though ${his} ${canPenetrateThroat(V.PC) ? `throat` : `mouth`} gets a little sore.`);
 				} else {
 					r.push(`week.`);
 				}
diff --git a/src/endWeek/saServeYourOtherSlaves.js b/src/endWeek/saServeYourOtherSlaves.js
index 078543fd4a3..b96c80aed8e 100644
--- a/src/endWeek/saServeYourOtherSlaves.js
+++ b/src/endWeek/saServeYourOtherSlaves.js
@@ -893,7 +893,7 @@ App.SlaveAssignment.serveYourOtherSlaves = function saServeYourOtherSlaves(slave
 					}
 					r.push(`is licked clean of any slave food clinging to it.`);
 					if (domSlave.skill.oral - ((slave.dick * 15) - 20) >= 0) {
-						r.push(`${subName} practically throws ${his} cup when ${domName} sucks the entire length of ${his} dick into ${his2} mouth and down ${his2} throat, and`);
+						r.push(`${subName} practically throws ${his} cup when ${domName} sucks the entire length of ${his} dick into ${his2} mouth${canPenetrateThroat(slave) ? `and down ${his2} throat` : ``}, and`);
 					} else {
 						r.push(`${subName} shudders as ${domName} wraps ${his2} lips around ${his} cockhead and`);
 					}
@@ -905,7 +905,7 @@ App.SlaveAssignment.serveYourOtherSlaves = function saServeYourOtherSlaves(slave
 						} else if (slave.balls >= 30 || slave.prostate > 2) {
 							r.push(`unleashing a massive spurt down ${domName}'s throat. ${domName} gags and pulls back, receiving the rest of ${subName}'s load across ${his2} face and body. ${domName} couldn't even come close to hiding what happened — just the way ${he2} likes it.`);
 						} else if (slave.balls >= 10) {
-							r.push(`filling ${domName}'s throat with such volume it sprays out ${his2} nose. ${domName} stands no chance of cleaning ${himself2} up without being seen — quite enjoyable, really.`);
+							r.push(`filling ${domName}'s ${canPenetrateThroat(slave) ? `mouth and throat` : `mouth`} with such volume it sprays out ${his2} nose. ${domName} stands no chance of cleaning ${himself2} up without being seen — quite enjoyable, really.`);
 						} else {
 							r.push(`giving ${domName} a cum chaser to ${his2} meal.`);
 						}
diff --git a/src/events/PESS/pessHeadgirlDickgirl.js b/src/events/PESS/pessHeadgirlDickgirl.js
index 4640d67c3bf..ececef0edf2 100644
--- a/src/events/PESS/pessHeadgirlDickgirl.js
+++ b/src/events/PESS/pessHeadgirlDickgirl.js
@@ -34,7 +34,7 @@ App.Events.pessHeadgirlDickgirl = class pessHeadgirlDickgirl extends App.Events.
 		if (V.seeRace === 1) {
 			r.push(`${subSlave.race}`);
 		}
-		r.push(`throat serving as a hole for ${S.HeadGirl.slaveName} to fuck`);
+		r.push(`${canPenetrateThroat(S.HeadGirl) ? `throat` : `mouth`} serving as a hole for ${S.HeadGirl.slaveName} to fuck`);
 		if (V.seeRace === 1) {
 			r.push(`with ${his2} ${S.HeadGirl.race} cock`);
 		}
diff --git a/src/events/PETS/petsStewardessBeating.js b/src/events/PETS/petsStewardessBeating.js
index fb4129fca51..29abe54cdc0 100644
--- a/src/events/PETS/petsStewardessBeating.js
+++ b/src/events/PETS/petsStewardessBeating.js
@@ -60,8 +60,10 @@ App.Events.petsStewardessBeating = class petsStewardessBeating extends App.Event
 			r.push(`In a conversational tone of voice, you tell ${S.Stewardess.slaveName} to continue the spanking. ${subSlave.slaveName} has one anguished second to realize what's happening before you shove yourself`);
 			if (V.PC.dick === 0) {
 				r.push(`against ${his2} mouth.`);
-			} else {
+			} else if (canPenetrateThroat(V.PC)) {
 				r.push(`down ${his2} throat.`);
+			} else {
+				r.push(`into ${his} mouth.`);
 			}
 			r.push(`${He2} gags reflexively, jerking back, only to jerk forward again in automatic pain avoidance when ${S.Stewardess.slaveName} hits ${his2} already-sore buttocks yet again. ${He2}'s broken enough to understand that ${he2} needs to relax and let ${himself2} be abused, but ${his2} body's reflexive responses deny ${him2} the relief that might be given. The sadistic stewardess <span class="devotion inc">comes twice</span> before you do, a deliciously aggressive expression on ${his} face. Poor ${subSlave.slaveName} staggers off coughing, promising to <span class="trust dec">never offend</span> again.`);
 			S.Stewardess.devotion += 4;
diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js
index d3ce9b1c5f0..0169088f53c 100644
--- a/src/js/statsChecker/statsChecker.js
+++ b/src/js/statsChecker/statsChecker.js
@@ -719,6 +719,27 @@ globalThis.canPenetrate = function(slave) {
 	return true;
 };
 
+
+/**
+ * @param {FC.HumanState} slave
+ * @returns {boolean}
+ */
+globalThis.canPenetrateThroat = function(slave) {
+	if (!slave) {
+		return null;
+	}
+	if (!canPenetrate(slave)) {
+		return false;
+	}
+	if (slave.dick >= 5 || (slave.dick >= 3 && canAchieveErection(slave))) { // Normal dicks can penetrate throat, large soft ones can too
+		return true;
+	}
+	if (slave.clit >= 4) { // Penis-like clits can penetrate throat
+		return true;
+	}
+	return false;
+};
+
 /**
  * @param {FC.HumanState} slave
  * @returns {boolean}
-- 
GitLab