diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a1d0c4f48183e7e8d6fd4b257086a26f53c2fd4..788597c43f1c02e11cabe0acf121830ddf35af11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) * favorites system improvements * ability to export and import starting girls and starting settings * defiant slaves are more of a problem +* RESSdesperateBreeder * fixes ## 0.10.7.1-4.0.0-alpha.29 - 2024-02-03 diff --git a/src/events/RESS/desperateBreeder.js b/src/events/RESS/desperateBreeder.js new file mode 100644 index 0000000000000000000000000000000000000000..3f695c91c1bcd66534eb549dd69d8c1da27b087e --- /dev/null +++ b/src/events/RESS/desperateBreeder.js @@ -0,0 +1,303 @@ +App.Events.RESSDesperateBreeder = class RESSDesperateBreeder extends App.Events.BaseEvent { + eventPrerequisites() { + return [ + () => canPenetrate(V.PC), + () => V.PC.belly < 100000, + ]; + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== Fetish.MINDBROKEN, + s => s.sexualFlaw === SexualFlaw.BREEDER, + canGetPregnant, + s => canImpreg(s, V.PC), + s => ((s.mpreg === 0 && s.vagina > 0) || (s.mpreg === 1 && s.anus > 0)), + s => s.preg === 0, + s => s.counter.PCChildrenBeared > 2, + s => s.belly < 100, + s => s.trust > 50, + s => s.devotion > 20, + s => overpowerCheck(s, V.PC) < 0, + canSee, + canHear, + hasBothArms, + canWalk + ] + ]; + } + + execute(node) { + const [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, His, his, him, himself, women, girl + } = getPronouns(eventSlave); + const {title: Master, say} = getEnunciation(eventSlave); + const {womenPC} = getPronouns(V.PC).appendSuffix("PC"); + + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + let t = []; + + t.push(`It's not particularly unusual to get night visits every now and then from your more amorous slaves, so when you are roused from your sleep by the paraphilic`); + t.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), ",")); + t.push(`you easily guess what the ${girl} is after.`); + if (canTalk(eventSlave)) { + t.push(`"${Master}," ${he} whispers. "${Spoken(eventSlave, `I can't take it any longer, I need a baby in me.`)}"`); + t.push(`${His} voice begins to rise as the prospect of having ${his} addiction sated comes closer.`); + t.push(`"${Spoken(eventSlave, `I can feel the egg inside me, ${Master}, and I want, no, NEED you to fertilize it for me. You'll do that, right? You've done it before...`)}"`); + t.push(`${He} begins grinding ${his} ${eventSlave.mpreg === 1 ? "rear" : "pussy"} against your crotch, hoping to entice you erect. Your body quickly responds and ${he} positions ${himself} to be penetrated.`); + t.push(`"${Spoken(eventSlave, `See ${Master}? He wants it too!`)}"`); + t.push(`${He} wiggles against the tip, a hungry glint in ${his} eye${hasBothEyes(eventSlave) ? "s" : ""}.`); + t.push(`"${Spoken(eventSlave, `He knows I'm ready to be knocked up... So stop trying to deny your feelings and FUCK ME! KNOCK ME UP! NOW!`)}"`); + } else { + t.push(`${He} uses gestures that ${he} wants a baby put in ${him} immediately, and since you've done it in the past, you're going to do it again. ${His} motions become increasingly erratic as ${he} begins grinding ${his} ${eventSlave.mpreg === 1 ? "rear" : "pussy"} against your crotch in an effort to bring you to erection. Your body quickly responds and ${he} positions ${himself} to be penetrated. The hunger in ${his} eye${hasBothEyes(eventSlave) ? "s" : ""} is obvious as ${he} struggles to convey how hard it is for ${him} not to be with child and how badly you want to put another bun or two in ${his} oven. ${He} wiggles against the tip of your eager cock, forcing you to support ${his} weight as ${he} desperately signs for you to drop ${him} on your shaft.`); + } + App.Events.addParagraph(node, t); + t = []; + t.push(`You are aware of ${his} pregnancy obsession, so ${he} is likely to calm down and stop ${canTalk(eventSlave) ? "all the shouting" : `${his} outburst`} once you've blown your load inside ${him}, but you would be giving up control of the situation.`); + App.Events.addParagraph(node, t); + t = []; + + App.Events.addResponses(node, [ + new App.Events.Result(`Give ${him} what ${he} wants`, matingPress), + new App.Events.Result(`Let ${him} have ${his} way`, cowgirl), + new App.Events.Result(`Push ${him} off`, reverseRape), + ]); + + function matingPress() { + let frag = document.createDocumentFragment(); + t = []; + + t.push(`Fine then, if ${he} wants a baby that badly, you'll give ${him} one. You guide ${him} onto ${his} back as ${he}`); + if (canTalk(eventSlave)) { + t.push(`tries to ${say} a thank you,`); + } else { + t.push(`attempts to sign ${his} gratitude,`); + } + t.push(`but you don't let ${him} finish. You grab ${him} by the legs, pinning ${him} in a mating press as you hilt yourself in ${his} ${eventSlave.mpreg === 1 ? "asspussy" : "vagina"} and completely derail any train of thought ${he} may have had. You may be giving ${him} what ${he} wants, but you aren't about to let ${him} catch you with a leg lock and milk every last drop of sperm out of you that ${he} can manage. You take it nice and slow, savoring the pleasure as ${he} gasps in anticipation before releasing your seed`); + if (V.PC.dick > 2) { + t.push(`deep `); + } else { + t.push(`as deep as you can`); + } + t.push(`inside ${him}, setting off ${his} orgasm and leaving ${him} squirming as you lazily let the last several globs slip into ${him}. Satisfied, you roll back into bed and go back to sleep as ${he} cuddles up beside you. Other than the heavy breathing, at least ${he}'s quieter now.`); + App.Events.addParagraph(frag, t); + t = []; + t.push(`You awake later that morning to find ${him} cradling ${his} ${eventSlave.bellySagPreg > 0 ? "softly sagging" : "lower"} belly, <span class="devotion inc">savoring the gift</span> you've planted in ${him}.`); + if (canTalk(eventSlave)) { + t.push(`"${Spoken(eventSlave, `I'm sorry I got a little out of control last night, ${Master}. Thank you for putting up with me, I'm not sure many ${womenPC} would.`)}"`); + } else { + t.push(`When ${he} notices you're up, ${he} quickly apologizes for ${his} actions, and thanks you for being willing to put up with ${his} mental hang-ups.`); + } + t.push(`<span class="trust inc">${He}'s lucky to have you and ${he} knows it.</span>`); + App.Events.addParagraph(frag, t); + eventSlave.devotion += 3; + eventSlave.trust += 2; + tryKnockMeUp(eventSlave, 100, 2, V.PC); + if (eventSlave.mpreg === 1) { + seX(eventSlave, "anal", V.PC, "penetrative", 1); + } else { + seX(eventSlave, "vaginal", V.PC, "penetrative", 1); + } + + return frag; + } + + function cowgirl() { + let facialDiverted = true; + let frag = document.createDocumentFragment(); + t = []; + + t.push(`If ${he} wants to do all the work, then you'll just lie back and enjoy the show.`); + if (canTalk(eventSlave)) { + t.push(`${He} squeels with glee,`); + t.push(`"${Spoken(eventSlave, `Sure thing! That first load should be just about ready, so we'll definitely be going again. You don't mind that, right ${Master}?`)}"`); + } else { + t.push(`${He} smiles happily as ${he} begins riding your dick.`); + } + t.push(`Having been edged this whole time, you don't last long under ${his} vigorous assault on your crotch and quickly fire a load into ${his} depths.`); + if (canTalk(eventSlave)) { + t.push(`"${Spoken(eventSlave, `Oh no, ${Master}, that felt small, there's no way I could be pregnant off just that. You need to be worked harder to really fill me with cum, but don't worry, leave it all to me.`)}"`); + } else { + t.push(`${He} frowns, clearly dissatisfied with your half-asleep cumshot. ${He} picks up the pace, desperate to milk a real ejaculation out of you.`); + } + App.Events.addParagraph(frag, t); + t = []; + if (V.PC.belly >= 30000) { + t.push(`As much as you'd like to watch ${him} bounce around, all you have is a view of your ${V.PC.bellyPreg > 100 ? "pregnant" : "bulging"} belly being pressed forward by ${his} efforts.`); + if (canTalk(eventSlave)) { + if (V.PC.bellyPreg > 100) { + t.push(`"${Spoken(eventSlave, `You're a nasty ${girl}, ${Master},`)}"`); + t.push(`${he} ${say}s,`); + t.push(`"${Spoken(eventSlave, `teasing me with that bump. You better make it up to me by filling me with babies.`)}"`); + } else { + t.push(`"${Spoken(eventSlave, `You're such a tease, ${Master},`)}"`); + t.push(`${he} ${say}s,`); + t.push(`"${Spoken(eventSlave, `you know I can't wait until I have a baby bump that big.`)}"`); + } + } else { + t.push(`You can tell ${he} is envious of your rounded middle, eager to have ${his} own expanding to match.`); + } + if (eventSlave.dick > 0 && eventSlave.chastityPenis === 0 && canAchieveErection(eventSlave)) { + t.push(`As ${he} bobs up and down on your shaft, you notice something hard rubbing against the underside of your stomach; ${his} own erection is grinding uncontrolled against you and ${he} is so caught up in the act that you doubt ${he}'ll have the respect to direct ${his} ejaculation away from you. Before long, ${he} clenches up in orgasm and you feel exactly what you expected splatter across your underbelly.`); + facialDiverted = false; + } + } else { + t.push(`You enjoy the sight of ${his}`); + if (eventSlave.boobs >= 300) { + if (eventSlave.boobs < 400) { + t.push(`small breasts`); + } else if ((eventSlave.boobsImplant / eventSlave.boobs) >= .75) { + t.push(`fake tits`); + } else if (eventSlave.boobs < 1000) { + t.push(`large breasts`); + } else if (eventSlave.boobs < 2500) { + t.push(`heavy boobs`); + } else { + t.push(`enormous udders`); + } + t.push(`and`); + } + if (eventSlave.bellySagPreg > 0) { + t.push(`body, still saggy and loose from prior pregnancy,`); + } else if (eventSlave.weight >= 95) { + t.push(`wobbly`); + } else if (eventSlave.weight > 30) { + t.push(`chubby`); + } else if (eventSlave.weight > 10) { + t.push(`soft`); + } else if (eventSlave.muscles > 50) { + t.push(`ripped`); + } else if (eventSlave.muscles > 10) { + t.push(`toned`); + } else { + t.push(`lithe`); + } + t.push(`body bouncing`); + if (V.PC.belly >= 5000) { + t.push(`up and down over the swell of your ${V.PC.bellyPreg > 100 ? "pregnant" : "bulging"} belly.`); + } else { + t.push(`around as ${he} bobs up and down on your shaft.`); + } + if (canTalk(eventSlave)) { + if (V.PC.bellyPreg > 100) { + t.push(`"${Spoken(eventSlave, `You're such a tease, ${Master},`)}"`); + t.push(`${he} ${say}s as ${he} leans into your pregnancy,`); + t.push(`"${Spoken(eventSlave, `you know I can't wait until mine starts growing.`)}"`); + } else { + t.push(`"${Spoken(eventSlave, `Do you like what you see, ${Master},`)}"`); + t.push(`${he} ${say}s teasingly,`); + t.push(`"${Spoken(eventSlave, `there's no way I'm making it out of here without a baby in my belly, am I?`)}"`); + } + } + if (eventSlave.dick > 0 && eventSlave.chastityPenis === 0) { + const cumShot = cumLoad(eventSlave); + if (eventSlave.dick > 10) { + t.push(`You're very aware of ${his} massive dick slapping against you and the precum from its tip getting dangerously close to dripping on you. You order ${him} to point it somewhere else, and when it falls on deaf ears, you take it upon yourself to shove it to the side so ${he} may ejaculate someplace easier to clean tomorrow.`); + } else if (canAchieveErection(eventSlave)) { + t.push(`You can't help but notice ${his} erection and the precum beading at its tip. You order ${him} to point it somewhere else, but ${he} is too lost in ${his} growing pleasure to listen. Worse still, you're pinned under ${his} weight and have no chance of avoiding the coming ejaculation, nor any that follow it.`); + if (cumShot >= 1) { + t.push(`The amount of semen that flows from ${him} when ${he} cums is unreal, and there is no blocking it from washing across you.`); + } else if (cumShot >= .1) { + t.push(`You manage to block ${him} from giving you a facial with your hand, but you still end up coated in streaks out ${his} cum.`); + } else { + t.push(`As if it is any condolence, at least ${his} loads are weak and meekly splatter across your lower belly when ${he} cums.`); + } + facialDiverted = false; + } else { + t.push(`You can't help but notice ${his} limp dick flopping about and the precum being flung from its tip. You order ${him} to get it under control, but ${he} is too lost in ${his} growing pleasure to listen. Worse still, you're pinned under ${his} weight and have no chance of avoiding the coming ejaculation, nor any that follow it.`); + if (cumShot >= 1) { + t.push(`Like a loose firehose, ${he} sprays a jet semen hapazardly across you, ${himself} and ${his} surroundings, thoroughly soaking everything in range.`); + } else if (cumShot >= .1) { + t.push(`You block most of ${his} cum from splashing across your face, but it still ends up all over the place.`); + } else { + t.push(`As if it is any condolence, at least ${his} loads are small even thouugh ${he} still shakes them everywhere.`); + } + facialDiverted = false; + } + } + } + App.Events.addParagraph(frag, t); + t = []; + t.push(`${He} rides you for what feels like hours with little regard for your enjoyment; ${his} only goal being to get as much of your baby batter into ${his} fertile womb as possible. With one last blast of ${eventSlave.balls > 0 ? "your " : ""}cum, ${he} finally finishes and drunkely slides to your side, a hand resting`); + if (cumLoad(V.PC) >= 1) { + t.push(`on the swell ${his} semen-filled`); + } else { + t.push(`over ${his} lower `); + } + t.push(`belly, <span class="trust inc">completely satisfied.</span>`); + if (!facialDiverted) { + if (V.PC.balls >= 50) { + t.push(`You, on the other hand, are left covered in ${his} sperm with a pair of painfully sore balls from where ${he} was bouncing against them.`); + } else { + t.push(`You, on the other hand, are left with a sore dick, an aching pelvis, and a layer of ${his} ${eventSlave.geneMods.aggressiveSperm === 1 ? "lively" : "rapidly drying"} sperm.`); + } + if (canMove(V.PC)) { + t.push(`You slide out of bed to go clean yourself up and have a little ${V.PC.refreshment} to calm yourself down.`); + } else if (haremLength() + servantsLength() > 0) { + t.push(`You call for ${servantsLength() > 0 ? "one of your servants" : "a member of your harem"} to clean you up and bring you a little ${V.PC.refreshment} to calm your nerves.`); + } else { + if (eventSlave.geneMods.aggressiveSperm === 1 && isVirile(eventSlave)) { + t.push(`And since you can't move yourself, you're stuck like this until your morning cleaning, which means you can do nothing but watch as ${his} energetic loads steadily make their way down to your crotch. By the time the sun rises,`); + if (canImpreg(V.PC, eventSlave)) { + t.push(`<span class="pregnancy">you've been thoroughly impregnated.</span>`); + tryKnockMeUp(V.PC, 100, 2, eventSlave); + } else { + t.push(`most of ${his} cum has worked its way into your body; it's a good thing ${he} can't get you pregnant.`); + } + } else { + t.push(`And since you can't move yourself, you're stuck with ${his} loads all over you until your morning cleaning. Just great.`); + } + } + } else if (V.PC.balls >= 50) { + t.push(`You, on the other hand, are left to try and fall back to sleep with a pair of painfully sore balls from where ${he} was bouncing against them.`); + } else { + t.push(`You, on the other hand, are left to try and fall back to sleep with a sore dick and an aching pelvis.`); + } + App.Events.addParagraph(frag, t); + eventSlave.trust += 4; + tryKnockMeUp(eventSlave, 100, 2, V.PC); + if (eventSlave.mpreg === 1) { + seX(eventSlave, "anal", V.PC, "penetrative", 4); + } else { + seX(eventSlave, "vaginal", V.PC, "penetrative", 4); + } + + return frag; + } + + function reverseRape() { + t = []; + + t.push(`When you try to reach for ${him}, ${he} grabs your ${hasBothArms(V.PC) ? "wrists" : "wrist"} and pins you down; ${he}'s got the advantage over you and intends to use it.`); + if (canTalk(eventSlave)) { + t.push(`"${Spoken(eventSlave, `No! I need this! You WILL get me pregnant!`)}"`); + } else { + t.push(`${He} glares ferociously at you, obviously intending to take what ${he} came here for by force if necessary.`); + } + t.push(`As ${he} slames down on your erect dick, it becomes clear just how far ${he} planned this out; ${he} has been keeping you on edge so that just a few quick bounces are all it takes to bring you to climax.`); + if (canTalk(eventSlave)) { + t.push(`${He} leans in close and whispers,`); + t.push(`"${Spoken(eventSlave, `Thank you, ${Master}, you're the best,`)}"`); + t.push(`before snapping back to ${his} senses and releasing you.`); + } else { + t.push(`As ${he} feels your warm ejaculate fill ${his} depths, ${he} gestures apology after apology in the vain hope that you'll show mercy before clambering off of you.`); + } + if (canTalk(eventSlave)) { + t.push(`"${Spoken(eventSlave, `I'm sorry, I'm so sorry! I didn't mean it to be like this...`)}"`); + } + t.push(`${He} quickly flees the scene, <span class="trust dec">terrified of the impending repercussions.</span>`); + eventSlave.trust -= 10; + tryKnockMeUp(eventSlave, 100, 2, V.PC); + if (eventSlave.mpreg === 1) { + seX(eventSlave, "anal", V.PC, "penetrative", 1); + } else { + seX(eventSlave, "vaginal", V.PC, "penetrative", 1); + } + + return t; + } + } +}; diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js index 62b615bfae516c5e917164ebee69da105593be2f..9d4173cf9f3fa8f1c399068db1a0fdbac68b8332 100644 --- a/src/events/randomEvent.js +++ b/src/events/randomEvent.js @@ -37,6 +37,7 @@ App.Events.getIndividualEvents = function() { new App.Events.RESSCoolerLockin(), new App.Events.RESSCowMilking(), new App.Events.RESSCumslutWhore(), + new App.Events.RESSDesperateBreeder(), new App.Events.RESSDesperatelyHorny(), new App.Events.RESSDesperateNull(), new App.Events.RESSDevotedAnalVirgin(),