diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index fa2e590df7737d3983ad3b5a3ada8aec9dfd0138..9e1bf105ccc2fdcd79ad2e948ecf8121cb718ff7 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -891,6 +891,7 @@ App.Data.resetOnNGPlus = { propOutcome: 0, EliteSires: [], raped: -1, + rapedThisWeek: 0, missingParentID: -10000, /* animalParts: 0,*/ pregSpeedControl: 0, diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js index 0774ad19271af2bde0d1275f753623595a9e2013..8c40ac2bc949e973d0d8e298553598b70a472ee5 100644 --- a/src/002-config/fc-version.js +++ b/src/002-config/fc-version.js @@ -2,5 +2,5 @@ App.Version = { base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed. pmod: "4.0.0-alpha.27", commitHash: null, - release: 1208, // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js. + release: 1209, // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js. }; diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js index ddfd8e89112942d2b2030c68ac6746703dc344d8..5731b7ca5718ab2b59e531d70dfe8aee935c80cc 100644 --- a/src/data/backwardsCompatibility/datatypeCleanup.js +++ b/src/data/backwardsCompatibility/datatypeCleanup.js @@ -1557,6 +1557,7 @@ globalThis.PCDatatypeCleanup = (function PCDatatypeCleanup() { PC.counter.slavesKnockedUp = Math.max(+PC.counter.slavesKnockedUp, 0) || 0; PC.counter.storedCum = Math.max(+PC.counter.storedCum, 0) || 0; PC.counter.reHymen = Math.max(+PC.counter.reHymen, 0) || 0; + PC.counter.raped = Math.max(+PC.counter.raped, 0) || (V.raped && (V.raped > 0) ? 1 : 0); PC.counter.moves = Math.max(+PC.counter.moves, 0) || 0; PC.counter.quick = Math.max(+PC.counter.quick, 0) || 0; diff --git a/src/endWeek/economics/reputation.js b/src/endWeek/economics/reputation.js index e36b88077601f130b70ebd52062450b78cbb1ac3..db0a35117902ee3baa92574b25e2914e516ef2b7 100644 --- a/src/endWeek/economics/reputation.js +++ b/src/endWeek/economics/reputation.js @@ -976,6 +976,54 @@ App.EndWeek.reputation = function() { repX(forceNeg(1 * V.PC.degeneracy), "PCactions"); } } + if (V.rapedThisWeek) { + let rapeFameDec = 25 + V.rapedThisWeek * 75; + r.push(`There's ${V.PC.degeneracy ? "also " : ""}a rumor you've been raped${V.PC.counter.raped ? " again" : ""}.`); + if (V.rep < 3000) { + r.push(`Since you are almost unknown, the rumor goes almost unnoticed.`); + rapeFameDec *= V.rep / 10000; + } else if (V.rep < 6000) { + r.push(`Since you are not very well known, the rumor goes quite unnoticed.`); + rapeFameDec *= V.rep / 10000; + } else if (V.rep < 9000) { + r.push(`Since you are not well known, the rumor does not have much impact.`); + rapeFameDec *= V.rep / 10000; + } + if (FutureSocieties.isActive("FSAntebellumRevivalist")) { + if (V.SecExp.edicts.weaponsLaw > 0) { + r.push(`Your citizens are relieved that they are allowed to bear arms to defend themselves against possible attacks.`); + rapeFameDec *= .8; + } else { + r.push(`Your citizens would feel safer if they were allowed to bear weapons to defend themselves against possible attacks.`); + rapeFameDec *= 1.2; + } + } else if (FutureSocieties.isActive("FSSubjugationist") && V.PC.race === V.arcologies[0].FSSubjugationistRace) { + r.push(`Your citizens see your rape as normal since you are ${V.PC.race}.`); + rapeFameDec *= .5; + } else if (FutureSocieties.isActive("FSSupremacist") && V.PC.race === V.arcologies[0].FSSupremacistRace) { + r.push(`Your citizens consider your rape an atrocity, since you are ${V.PC.race}.`); + rapeFameDec *= 1.2; + } else if (FutureSocieties.isActive("FSRepopulationFocus") && (isFertile(V.PC) || ((V.PC.vagina >= 0 || V.PC.mpreg) && V.PC.preg < 10))) { + r.push(`All things considered, your citizens hope that at least you have become pregnant.`); + rapeFameDec *=.9; + } + if (V.arcologies[0].FSChattelReligionistLaw === 1) { + r.push(`The Prophet has been sullied, and this is a sacrilege.`); + rapeFameDec *= 1.2; + } + if (V.arcologyUpgrade.drone !== 1) { + r.push(`The lack of security is scaring people.`); + rapeFameDec *= 1.3; + } + if (V.policies.sexualOpenness === 1 && FutureSocieties.isActive("FSNull")) { + r.push(`Since you have shown interest in being penetrated, many people think that it's not a real rape, that you are role-playing with some friend.`); + rapeFameDec *= .5; + } + rapeFameDec = Math.clamp(Math.floor(rapeFameDec), 0, 250); + repX(forceNeg(rapeFameDec), "PCactions"); + V.PC.counter.raped = (V.PC.counter.raped || 0) + V.rapedThisWeek; + V.rapedThisWeek = 0; + } if (V.FCNNstation === 1) { r.push(`Playing host to the Free Cities News Network brings <span class="green">approval</span> from those who still consider freedom of the press a virtue.`); diff --git a/src/endWeek/saDevotion.js b/src/endWeek/saDevotion.js index 2f6974c57adf7d51830bc22278acbfe0af7fc18f..f6183164b6b904a15e00188ba192b819ddd208f2 100644 --- a/src/endWeek/saDevotion.js +++ b/src/endWeek/saDevotion.js @@ -689,7 +689,7 @@ App.SlaveAssignment.devotion = function saDevotion(slave) { if (!getPersonalAttention(slave.ID, "torture")) { if (canSee(slave) && slave.assignment === Job.FUCKTOY) { if (slave.fetish === Fetish.SADIST) { - r.push(`${He} has <span class="devotion dec">fun</span> watching you spend your free time brutalizing a helpless slave. On the other hand, that ${he} could be next was a <span class="trust dec">little worrying.</span>`); + r.push(`${He} has <span class="devotion inc">fun</span> watching you spend your free time brutalizing a helpless slave. On the other hand, that ${he} could be next was a <span class="trust dec">little worrying.</span>`); slave.devotion++; slave.trust -= 5; } else { @@ -738,6 +738,29 @@ App.SlaveAssignment.devotion = function saDevotion(slave) { } } } + if (V.rapedThisWeek) { + r.push(`Some of your slaves whisper among themselves that you have been raped.`); + 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) { + r.push(`${He} daydreams about being able to do it ${himself}, slowly <span class="trust inc">subduing and dominating you</span> under his power.`); + } else { + 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) { + 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; + } else if (slave.trust <= 50) { + r.push(`${He} feels <span class="trust dec">vulnerable</span> because <span class="devotion dec">${his} ${getWrittenTitle(slave)} can't even protect ${playerPronouns.himself}.</span>`); + 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>`); + } + } } /** diff --git a/src/events/RESS/breedingBull.js b/src/events/RESS/breedingBull.js index 63a296df5cafe980fd57cb05f735a2252efeecc7..45c20ca19b4d1aa3a9553c1074e5cc83fd53fc4f 100644 --- a/src/events/RESS/breedingBull.js +++ b/src/events/RESS/breedingBull.js @@ -89,6 +89,7 @@ App.Events.RESSBreedingBull = class RESSBreedingBull extends App.Events.BaseEven App.Events.addParagraph(frag, [`You awaken some time later, your crotch extremely sore and your belly slightly bloated. Most of ${his} deposit has flowed back out of you, but you still feel a fair amount sloshing inside you. You sigh to yourself, knowing you have nobody to blame but yourself for this. ${He}'s a breeding bull and you a fertile ${womanP}. ${He} only did what ${he} was conditioned for; the fault is on you for ignoring the warning signs and not taking the proper precautions. Still, there is no doubt in your mind that <span class="lime">you're pregnant</span> with ${his} child.`]); knockMeUp(V.PC, 100, 0, eventSlave.ID); seX(eventSlave, "penetrative", V.PC, "vaginal", 4); + V.rapedThisWeek = (V.rapedThisWeek || 0) + 1; } return frag; @@ -130,6 +131,7 @@ App.Events.RESSBreedingBull = class RESSBreedingBull extends App.Events.BaseEven App.Events.addParagraph(frag, [`Panting, you look over the damage: Your pussy is gaping, there is semen everywhere, and given the steady flow from you, ${he} likely got some of that ejaculation in you. You sigh to yourself, knowing you have nobody to blame but yourself for this. ${He}'s a breeding bull and you, a fertile ${womanP}. ${He} only did what ${he} was conditioned for; the blame is on you for ignoring the warning signs and not taking the proper precautions. Still, ${he} knew you were fertile and went right for the prize; it would be wise to assume you've been impregnated.`]); knockMeUp(V.PC, 20, 0, eventSlave.ID); seX(eventSlave, "penetrative", V.PC, "vaginal"); + V.rapedThisWeek = (V.rapedThisWeek || 0) + 1; return frag; } @@ -150,6 +152,7 @@ App.Events.RESSBreedingBull = class RESSBreedingBull extends App.Events.BaseEven } else { r.push(`pussy.`); } + V.rapedThisWeek = (V.rapedThisWeek || 0) + 1; r.push(`You groan with pain at the sheer size of the rod stretching out your poor hole and struggle to hold back the tears once ${he} starts thrusting. There is no pleasure for you here as ${he} batters your cervix; you barely stop yourself from screaming out as ${he} slams through your final defense`); if (S.Bodyguard) { const {his2} = getPronouns(S.Bodyguard).appendSuffix("2"); @@ -217,6 +220,7 @@ App.Events.RESSBreedingBull = class RESSBreedingBull extends App.Events.BaseEven knockMeUp(V.PC, 100, 0, eventSlave.ID); seX(eventSlave, "penetrative", V.PC, "vaginal", 4); App.Events.addParagraph(frag, r); + V.rapedThisWeek = (V.rapedThisWeek || 0) + 1; return frag; } diff --git a/src/events/RESS/mutinyAttempt.js b/src/events/RESS/mutinyAttempt.js index 8a8cbfa3f7d8d584f38b41d5f996d1d94df4e69a..431a3c3dcfa714587a8bdd40f45a5a941557c496 100644 --- a/src/events/RESS/mutinyAttempt.js +++ b/src/events/RESS/mutinyAttempt.js @@ -206,6 +206,7 @@ App.Events.RESSMutinyAttempt = class RESSMutinyAttempt extends App.Events.BaseEv if (canImpreg(V.PC, eventSlave)) { r.push(knockMeUp(V.PC, 50, 0, eventSlave.ID)); } + V.rapedThisWeek = (V.rapedThisWeek || 0) + 1; } App.Events.addParagraph(frag, r); App.Events.addResponses(frag, choices2); @@ -261,6 +262,7 @@ App.Events.RESSMutinyAttempt = class RESSMutinyAttempt extends App.Events.BaseEv } r.push(`Once spent, ${he} shoves you to the ground and crashes into your office chair. The moment ${he} lets down ${his} guard, you slam the heaviest object you can find into ${his} head. Now that you have ${him} controlled, it's time ${he} learned ${his} place — when ${he} wakes up, of course. It's more fun that way.`); seX(eventSlave, "penetrative", V.PC, "vaginal"); + V.rapedThisWeek = (V.rapedThisWeek || 0) + 1; App.Events.addParagraph(frag, r); App.Events.addResponses(frag, choices2); return frag; diff --git a/src/events/intro/pcAppearance.js b/src/events/intro/pcAppearance.js index 1e67757f0a785f3dcaa3efc15cee3ef456f3641b..76d0cf98967047ffb52020d7161daecd994a90ce 100644 --- a/src/events/intro/pcAppearance.js +++ b/src/events/intro/pcAppearance.js @@ -980,6 +980,7 @@ App.UI.Player.design = function() { ["Societal Elite", -6], ["Designer baby", -7], ["Futanari Sister", -9], + ["Rapist", -10], ]) .showTextBox(); } diff --git a/src/events/nonRandom/pRaped.js b/src/events/nonRandom/pRaped.js index 38478a64b26d1b9a3d1f500600457b432fecfd68..6ba243b891a32c44f87a97a4eb600691e2df8282 100644 --- a/src/events/nonRandom/pRaped.js +++ b/src/events/nonRandom/pRaped.js @@ -21,6 +21,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent { hisP, womanP, girlP } = getPronouns(V.PC).appendSuffix("P"); V.raped = 1; + V.rapedThisWeek = (V.rapedThisWeek || 0) + 1; const genParam = {minAge: 16, race: "nonslave", disableDisability: 1}; let rapist; @@ -62,6 +63,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent { if (!isHindered(V.PC)) { r.push(`over. With a single strike, the ${woman} tailing you lies in a heap on the ground.`); V.raped = 0; + V.rapedThisWeek--; } else { r.push(`over, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`); } @@ -70,6 +72,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent { if (!isHindered(V.PC)) { r.push(`You quickly disarm the assailant and knock them to the floor before placing them in a choke-hold. Once they are subdued, you stand back to decide what to do next.`); V.raped = 0; + V.rapedThisWeek--; } else { r.push(`You quickly try to disarm your assailant, but find your body has become a bit too ponderous as of late. After a short struggle, it is you that ends up pinned with a knife to the throat.`); } @@ -78,6 +81,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent { if (!isHindered(V.PC)) { r.push(`With a single stab, your own shiv is buried in ${his} chest, incapacitating ${him}.`); V.raped = 0; + V.rapedThisWeek--; } else { r.push(`You try to draw your shiv and stab ${him}, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`); } @@ -320,7 +324,7 @@ App.Events.pRaped = class pRaped extends App.Events.BaseEvent { r.push(`not climaxing...`); } r.push(`Is this what it feels like to be bred by someone so dominant? You should take a pregnancy test right away and make sure ${he} didn't knock you up.`); - knockMeUp(V.PC, 100, 0, -2); + knockMeUp(V.PC, 100, 0, -10); } if (V.PC.vagina === 0) { V.PC.vagina++; diff --git a/src/events/scheduled/sePlayerBirth.js b/src/events/scheduled/sePlayerBirth.js index c24928ae8961870065ceafbdf650026cd9c3084e..de05d6eb0c7d000eeec9fa668fd56a03989a3cc2 100644 --- a/src/events/scheduled/sePlayerBirth.js +++ b/src/events/scheduled/sePlayerBirth.js @@ -61,6 +61,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent { let elite = 0; let lab = 0; let futaS = 0; + let rapists = 0; let slavesLength = 0; let babies = []; for (const baby of birthed) { @@ -91,6 +92,9 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent { } else if (baby.fatherID === -9) { futaS++; babies.push("a Futanari Sister"); + } else if (baby.fatherID === -10) { + rapists++; + babies.push("a rapist"); } else { const babyDaddy = getSlave(baby.fatherID); if (babyDaddy) { @@ -721,6 +725,8 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent { V.PC.counter.birthLab += lab; V.PC.counter.birthFutaSis += futaS; V.PC.counter.birthDegenerate += slavesLength; + V.PC.counter.birthRape = (V.PC.counter.birthRape || 0) + rapists; + V.PC.counter.birthFutaSis += futaS; if (curBabies === 1) { let p = 0; diff --git a/src/facilities/facilityRetrievalWorkaround.js b/src/facilities/facilityRetrievalWorkaround.js index 2fa4db315169853d4910ff5af0e06d553012df10..b0c4a74b62d649887c3680ee8d04f611789ef7c3 100644 --- a/src/facilities/facilityRetrievalWorkaround.js +++ b/src/facilities/facilityRetrievalWorkaround.js @@ -105,6 +105,8 @@ App.UI.facilityRetrievalWorkaround = function(facility) { r.append(`Lab crafted.`); } else if (slave.father === -9) { r.append(`Futanari Sister.`); + } else if (slave.father === -10) { + r.append(`Your rapist.`); } else { r.append(missingSlave); } diff --git a/src/facilities/nursery/utils/nurseryUtils.js b/src/facilities/nursery/utils/nurseryUtils.js index c39ab57df7b85a92864a25d604c3799d33daf46a..4680c67fdaabbd360484623963294a50ce46451a 100644 --- a/src/facilities/nursery/utils/nurseryUtils.js +++ b/src/facilities/nursery/utils/nurseryUtils.js @@ -751,6 +751,9 @@ App.Facilities.Nursery.nurserySort = function nurserySort() { case -9: r += `the Futanari Sister's`; break; + case -10: + r += `your rapist`; + break; default: if (slave.preg <= 5) { r += `someone's, though it is too early to tell whose,`; diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js index 26532b92ffcdc63c8dfc72e65b7a083d876128c9..e22a6d40131956d6c83eefbe15e1ec690ab736ba 100644 --- a/src/js/SlaveState.js +++ b/src/js/SlaveState.js @@ -1411,6 +1411,7 @@ App.Entity.SlaveState = class SlaveState { * accepts ID See Pregnancy Control section for more. * * Who sired her pregnancy + * * -10: a rapist * * -9: a futanari sister * * -8: an animal * * -7: designer baby @@ -2185,6 +2186,7 @@ App.Entity.SlaveState = class SlaveState { * | *-6* | Societal Elite | * | *-8* | Animal | * | *-9* | Futanari Sister | + * | *-10* | Rapist | * @type {Set<number>} */ this.partners = new Set(); diff --git a/src/js/birth/birth.js b/src/js/birth/birth.js index 69489a6c8118620f3a33351f2ca8ed29aeabf8ab..3db6da789e1192330e008304565e8bc77676c734 100644 --- a/src/js/birth/birth.js +++ b/src/js/birth/birth.js @@ -426,6 +426,8 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRen fathers.push("one of your animals"); } else if (baby.fatherID === -9) { fathers.push("a Futanari Sister"); + } else if (baby.fatherID === -10) { + fathers.push("a rapist"); } else { const babyDaddy = findFather(baby.fatherID); if (babyDaddy) { @@ -2136,6 +2138,8 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRen fathers.push("one of your animals"); } else if (baby.fatherID === -9) { fathers.push("a Futanari Sister"); + } else if (baby.fatherID === -10) { + fathers.push("a rapist"); } else { const babyDaddy = findFather(baby.fatherID); if (babyDaddy) { diff --git a/src/js/sexActsJS.js b/src/js/sexActsJS.js index 15ba1bdb4d9d1af5555ab159bc1a4a040fee956a..dafc34f40b3d532fad2664096d540e3abc6d5da9 100644 --- a/src/js/sexActsJS.js +++ b/src/js/sexActsJS.js @@ -547,6 +547,7 @@ globalThis.seX = function(slave1, act1, slave2, act2 = "penetrative", count = 1) * | *-6* | Societal Elite | * | *-8* | Animal | * | *-9* | Futanari Sister | + * | *-10* | Rapist | */ function addPartner(slave, partner) { /** @returns {FC.HumanState} */ diff --git a/src/npc/children/ChildState.js b/src/npc/children/ChildState.js index b02ba500b972bf8f426382953129cae763d45833..2d80ae90c4deb44d3c6a01943fe8399a96a83fce 100644 --- a/src/npc/children/ChildState.js +++ b/src/npc/children/ChildState.js @@ -737,6 +737,7 @@ App.Facilities.Nursery.ChildState = class ChildState { * accepts ID See Pregnancy Control section for more. * * Who sired her pregnancy + * * -10: a rapist * * -9: a futanari sister * * -8: an animal * * -7: designer baby diff --git a/src/npc/descriptions/womb/pregnancy.js b/src/npc/descriptions/womb/pregnancy.js index 0f66527bce7263da69dde812134ae5ddceeba496..10cc554a80974ff3228c7fdcbfc986b9b6e4ad23 100644 --- a/src/npc/descriptions/womb/pregnancy.js +++ b/src/npc/descriptions/womb/pregnancy.js @@ -589,6 +589,7 @@ App.Desc.pregnancy = function(slave, descType = DescType.NORMAL) { 6: `a member of the Societal Elite`, 8: `one of your pets`, 9: `a Futanari Sister`, + 10: `a rapist`, }; daddy = desc[Math.abs(daddy)]; } diff --git a/src/npc/generate/generateGenetics.js b/src/npc/generate/generateGenetics.js index 376787ebccba8b925d557f78063bdc2e3bf554e6..7ce11163d4acf295dd2900b3a47dd2d270b437bd 100644 --- a/src/npc/generate/generateGenetics.js +++ b/src/npc/generate/generateGenetics.js @@ -261,6 +261,9 @@ globalThis.generateGenetics = (function() { case -9: fatherName = "A Futanari Sister"; break; + case -10: + fatherName = "A rapist"; + break; default: fatherName = "Unknown"; } diff --git a/src/npc/generate/newSlaveIntro.js b/src/npc/generate/newSlaveIntro.js index 4f30d7bfdd8846d662bc6abc0c05b3b38989c4f5..8242e742319335e179038b69c50d8940b783d5ac 100644 --- a/src/npc/generate/newSlaveIntro.js +++ b/src/npc/generate/newSlaveIntro.js @@ -3462,6 +3462,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest = V.PC.vagina = 1; } seX(slave, "penetrative", V.PC, "vaginal"); + V.rapedThisWeek = (V.rapedThisWeek || 0) + 1; if (random(1, 100) > 60 && slave.fetish === Fetish.NONE) { slave.fetish = "dom"; slave.fetishStrength = 20; diff --git a/src/npc/interaction/fDick.js b/src/npc/interaction/fDick.js index ee6e89e307b221bf88c1519a014785384fffcdd1..ff2419de5305f29b69e73c2b566ff6069e1edd49 100644 --- a/src/npc/interaction/fDick.js +++ b/src/npc/interaction/fDick.js @@ -322,12 +322,13 @@ App.Interact.fDick = function(slave) { seX(V.PC, "anal", slave, "penetrative", 5); } else { seX(V.PC, "vaginal", slave, "penetrative", 5); - } + } } else { text.push(`Contently sighing, ${he} pulls ${his} still very hard cock from your overwhelmed body and forces it into your mouth, ready to blow a second load and give you a <span class="orangered">taste of your place,</span> before leaving you twitching and drooling cum.`); seX(V.PC, "oral", slave, "penetrative"); } slave.trust += 5; + V.rapedThisWeek = (V.rapedThisWeek || 0) + 1; } else { text.push(`You feel ${him} shift dominantly beneath you and in response`); diff --git a/src/npc/interaction/fSuckDick.js b/src/npc/interaction/fSuckDick.js index 1a60071eff3a97725aa294d6d81ac6e113028d12..b1668ebe10c61b018195e8c09eb3836e1ae70515 100644 --- a/src/npc/interaction/fSuckDick.js +++ b/src/npc/interaction/fSuckDick.js @@ -457,6 +457,7 @@ App.Interact.fSuckDick = function(slave) { } else { r.push(`You try to break free, but you don't have enough strength and your unsuccessful attempts only excite ${him} more. Finally you give up and decide to cooperate as best you can so that ${he} finishes as soon as possible.`); r.push(swallow()); + V.rapedThisWeek = (V.rapedThisWeek || 0) + 1; } App.Events.addParagraph(node, r); @@ -536,7 +537,7 @@ App.Interact.fSuckDick = function(slave) { } else if (isHorny(slave) && slave.devotion < 50 && slave.trust > 50 && jsRandom(1, 100) > 50) { // Slaves unable to warn with time enough r.push(`${He} warns you that ${his} orgasm is imminent at the time you feel a throbbing at the base of the dick, and ${amount <= 100 ? "liquid splatters in the back of your mouth" : "a thick spurt fills your mouth"}.`); - r.push(`You pull away immediately, taking out what's in your mouth. ${He} let ${himself} go, the expression on ${his} face is worried, but ${his} orgasm and ${his} moans increase in intensity, having cummed in your mouth arouses ${him}${isHorny(V.PC) ? ", and you too." : "."} You look at ${him} threateningly, you're really angry.`); + r.push(`You pull away immediately, taking out what's in your mouth. ${He} lets ${himself} go, the expression on ${his} face is worried, but ${his} orgasm and ${his} moans increase in intensity, having cummed in your mouth arouses ${him}${isHorny(V.PC) ? ", and you too." : "."} You look at ${him} threateningly, you're really angry.`); if (isHorny(V.PC)) { r.push(`You can't control yourself anymore and an intense, extremely pleasurable and endless orgasm takes control of your mind,`); diff --git a/src/player/electiveSurgery.js b/src/player/electiveSurgery.js index 2f3c6da196822b4aeb1efe6b777bb7743ca8dcd9..f02ff1e34667aca5d6ab4a79f28f3d37a4cf8b16 100644 --- a/src/player/electiveSurgery.js +++ b/src/player/electiveSurgery.js @@ -730,7 +730,7 @@ App.UI.electiveSurgery = function() { }; } else if (V.PC. vagina > 0) { if (V.PC.preg === 0) { - r.push(`"It looks like you have lost the warranty seal${V.PC.counter.reHymen ? " again" : ""}. I can give you a hymen reconstruction for only <span class="cash">${cashFormat(applyDiscount(2000))}.</span> No one will notice that your vagina has ${V.PC.counter.vaginal/V.week > 10 ? "largely" : ""} been used${V.raped > 0 ? " and abused" : ""}, it will be a perfect work of craftsmanship. The surgery will also serve to make your duct narrow like"`); + r.push(`"It looks like you have lost the warranty seal${V.PC.counter.reHymen ? " again" : ""}. I can give you a hymen reconstruction for only <span class="cash">${cashFormat(applyDiscount(2000))}.</span> No one will notice that your vagina has ${V.PC.counter.vaginal/V.week > 10 ? "largely" : ""} been used${V.PC.counter.raped > 0 ? " and abused" : ""}, it will be a perfect work of craftsmanship. The surgery will also serve to make your duct narrow like"`); if (V.PC.physicalAge < 13 || V.PC.actualAge < 13) { r.push("a child like you is supposed to have."); } else if (V.PC.visualAge < 13) { @@ -756,7 +756,7 @@ App.UI.electiveSurgery = function() { } })); } else { - r.push(`"It looks like you have lost the warranty seal${V.PC.counter.reHymen ? " again" : ""}. If you weren't pregnant, I could give you a hymen reconstruction for only <span class="cash">${cashFormat(applyDiscount(2000))}.</span> No one would notice that your vagina has ${V.PC.counter.vaginal/V.week > 10 ? "largely" : ""} been used${V.raped > 0 ? " and abused" : ""}, it would be a perfect work of craftsmanship. The surgery would also serve to make your duct narrow like"`); + r.push(`"It looks like you have lost the warranty seal${V.PC.counter.reHymen ? " again" : ""}. If you weren't pregnant, I could give you a hymen reconstruction for only <span class="cash">${cashFormat(applyDiscount(2000))}.</span> No one would notice that your vagina has ${V.PC.counter.vaginal/V.week > 10 ? "largely" : ""} been used${V.PC.counter.raped > 0 ? " and abused" : ""}, it would be a perfect work of craftsmanship. The surgery would also serve to make your duct narrow like"`); if (V.PC.physicalAge < 13 || V.PC.actualAge < 13) { r.push("a child like you is supposed to have."); } else if (V.PC.visualAge < 13) { diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js index 9cdbea311017f3b60767c2f3f5617950cf3eef82..55b779460f0e99b943b29a18692c7dd1e763996a 100644 --- a/src/player/js/PlayerState.js +++ b/src/player/js/PlayerState.js @@ -106,10 +106,14 @@ App.Entity.PlayerActionsCountersState = class { this.birthSelf = 0; /** how many designer babies you've produced */ this.birthLab = 0; + /** hoy many children you've had fruit of unknown rapists */ + this.birthRape = 0; /** untracked births */ this.birthOther = 0; /** how many units of your cum are stored away for artificially inseminating slaves */ this.storedCum = 0; + /** how many times you've been raped of forced to sex */ + this.raped = 0; /** shared variables */ /** amount of milk given */ this.milk = 0; @@ -965,6 +969,7 @@ App.Entity.PlayerState = class PlayerState { * accepts ID See Pregnancy Control section for more. * * Who sired your pregnancy + * * -10: a rapist * * -9: a futanari sister * * -8: an animal * * -7: designer baby @@ -1549,6 +1554,7 @@ App.Entity.PlayerState = class PlayerState { * | *-6* | Societal Elite* | * | *-8* | Animal* | * | *-9* | Futanari Sister* | + * | *-10* | Rapist* | * * **not currently implemented* * @type {Set<number>}