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