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