diff --git a/src/events/RESS/forbiddenMasturbation.js b/src/events/RESS/forbiddenMasturbation.js index 15b7846225639c71b6c3a453e18c3f4135dbaf62..01b1eb45bb8ab2266f250f702ea4c70cb73bc704 100644 --- a/src/events/RESS/forbiddenMasturbation.js +++ b/src/events/RESS/forbiddenMasturbation.js @@ -14,7 +14,7 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A s => s.trust >= -20, s => (s.chastityPenis !== 1 || s.dick === 0), hasAnyArms, - hasAnyLegs + hasAnyLegs, ] ]; } @@ -28,6 +28,9 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A const {title: Master} = getEnunciation(eventSlave); const {hisA, himselfA, HisA} = getPronouns(assistant.pronouns().main).appendSuffix('A'); const bellyAdj = bellyAdjective(eventSlave); + const knees = hasBothLegs(eventSlave) ? "knees" : "knee"; + + let offHand = "nothing"; V.nextLink = "Next Week"; @@ -94,22 +97,79 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A r.push(`There is a gentle alert from ${V.assistant.name}: "${properMaster()},`, contextualIntro(V.PC, eventSlave, "DOM"), `is masturbating in violation of the rules."`); } r.push(`A video feed appears.`); - if (eventSlave.chastityVagina) { - r.push(`In ${his} chastity belt, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"} and some furtive fingering of ${his} asshole.`); - } else if ((eventSlave.chastityPenis === 1)) { - r.push(`In ${his} chastity cage, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"} and some furtive fingering of ${his} asshole.`); - } else if ((eventSlave.dick > 0) && (eventSlave.hormoneBalance >= 100)) { - r.push(`Since ${he}'s impotent from hormone treatment, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`); - } else if ((eventSlave.dick > 0) && (eventSlave.balls > 0) && (eventSlave.ballType === "sterile")) { - r.push(`Since ${he}'s impotent due to ${his} useless balls, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`); - } else if ((eventSlave.dick > 0) && (eventSlave.balls === 0)) { - r.push(`Since ${he}'s impotent due to ${his} lack of balls, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`); - } else if (!canAchieveErection(eventSlave) && (eventSlave.dick > 6)) { + if (eventSlave.chastityVagina && eventSlave.chastityPenis === 1) { + r.push(`In ${his} combination chastity, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"}`); + if (hasBothArms(eventSlave) && canDoAnal(eventSlave)) { + r.push(`and some furtive fingering of ${his} asshole`); + offHand = "anal"; + } + r.push(r.pop() + `.`); + } else if (eventSlave.chastityVagina && eventSlave.dick === 0) { + r.push(`In ${his} chastity belt, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"}`); + if (hasBothArms(eventSlave) && canDoAnal(eventSlave)) { + r.push(`and some furtive fingering of ${his} asshole`); + offHand = "anal"; + } + r.push(r.pop() + `.`); + } else if (eventSlave.chastityPenis === 1 && eventSlave.vagina === -1) { + r.push(`In ${his} chastity cage, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"}`); + if (hasBothArms(eventSlave) && canDoAnal(eventSlave)) { + r.push(`and some furtive fingering of ${his} asshole`); + offHand = "anal"; + } + r.push(r.pop() + `.`); + } else if (eventSlave.dick > 0 && ((eventSlave.hormoneBalance >= 100) || (eventSlave.balls > 0 && eventSlave.ballType === "sterile") || (eventSlave.balls === 0))) { + r.push(`Since ${he}'s impotent`); + if (eventSlave.balls === 0) { + r.push(`due to ${his} lack of balls,`); + } else if (eventSlave.ballType === "sterile") { + r.push(`due to ${his} useless balls,`); + } else { + r.push(`from hormone treatment,`); + } + r.push(`all ${he} can manage is rubbing ${his} soft dick`); + if (hasBothArms(eventSlave)) { + if (canDoVaginal(eventSlave)) { + r.push(`and some furtive fingering of ${his} pussy.`); + offHand = "pussy"; + } else if (canDoAnal(eventSlave)) { + r.push(`and some furtive fingering of ${his} asshole.`); + offHand = "anal"; + } else { + r.push(`and some ${eventSlave.nipples !== "fuckable" ? `furious tweaking of ${his} nipples` : `furtive fingering of ${his} nipplecunts`}`); + offHand = "nipples"; + } + } + r.push(r.pop() + `.`); + } else if (!canAchieveErection(eventSlave) && eventSlave.dick > 6) { r.push(`Since ${his} dick requires far too much blood to get erect, ${he}'s furiously massaging the semi-engorged monster.`); - } else if (!canAchieveErection(eventSlave) && (eventSlave.dick > 0)) { - r.push(`Since ${he}'s can't get it up, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`); - } else if ((eventSlave.vagina === -1) && (eventSlave.dick === 0)) { - r.push(`${He}'s rubbing ${his} perineum desperately with one hand, and ${his} anus with the other, since ${he} lacks external genitalia.`); + } else if (!canAchieveErection(eventSlave) && eventSlave.dick > 0) { + r.push(`Since ${he}'s can't get it up, all ${he} can manage is rubbing ${his} soft dick`); + if (hasBothArms(eventSlave)) { + if (canDoVaginal(eventSlave)) { + r.push(`and some furtive fingering of ${his} pussy.`); + offHand = "pussy"; + } else if (canDoAnal(eventSlave)) { + r.push(`and some furtive fingering of ${his} asshole.`); + offHand = "anal"; + } else { + r.push(`and some ${eventSlave.nipples !== "fuckable" ? `furious tweaking of ${his} nipples` : `furtive fingering of ${his} nipplecunts`}`); + offHand = "nipples"; + } + } + r.push(r.pop() + `.`); + } else if (eventSlave.vagina === -1 && eventSlave.dick === 0) { + r.push(`${He}'s rubbing ${his} perineum desperately`); + if (hasBothArms(eventSlave)) { + if (canDoAnal(eventSlave)) { + r.push(`with one hand, and ${his} anus with the other,`); + offHand = "anal"; + } else { + r.push(`with one hand, and a nipple with the other,`); + offHand = "nipples"; + } + } + r.push(`since ${he} lacks external genitalia.`); } else if (eventSlave.vagina === -1) { r.push(`${He}'s furiously jacking off.`); } else if (eventSlave.clit >= 3) { @@ -171,7 +231,7 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A if (eventSlave.belly >= 300000) { r.push(`leans over ${his} ${bellyAdj} belly`); } else { - r.push(`gets on ${his} knees`); + r.push(`gets on ${his} ${knees}`); } r.push(`and sucks you off. ${He} does a decent job, playing with ${himself} all the while. ${He}'s learned that ${he} can get away with infractions if ${he}'s willing to suck dick afterward. ${His} resistance to your will <span class="devotion dec">has increased.</span>`); eventSlave.devotion -= 5; @@ -229,7 +289,7 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A } else { r.push(`suck your cock.`); } - r.push(`When you pretend indifference, ${he} abjectly begs. Soon, ${he}'s down on ${his} knees, crying a little with shame as ${he} masturbates furiously.`); + r.push(`When you pretend indifference, ${he} abjectly begs. Soon, ${he}'s down on ${his} ${knees}, crying a little with shame as ${he} masturbates furiously.`); seX(eventSlave, "oral", V.PC, "penetrative", 5); if (eventSlave.fetish === "cumslut" && eventSlave.fetishKnown === 1) { eventSlave.fetishStrength += 4; @@ -240,6 +300,15 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A r.push(`sucking cock`); } r.push(`has increased.</span>`); + } else if (eventSlave.fetish === "cumslut") { + eventSlave.fetishKnown = 1; + r.push(`<span class="fetish gain">${His} enjoyment of`); + if (V.PC.dick === 0) { + r.push(`giving head`); + } else { + r.push(`sucking cock`); + } + r.push(`is now clear to you.</span>`); } else if (random(1, 100) > 50) { eventSlave.fetish = "cumslut"; eventSlave.fetishKnown = 1; @@ -293,9 +362,12 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A } r.push(`${He} writhes and sobs at the orgasm denial, since the nipple play is just barely enough to keep ${him} at a high level of arousal without giving relief. You switch back and forth until ${he} finally goes over into muscle-spasming climax during nipple stimulation alone.`); seX(eventSlave, "mammary", V.PC, "penetrative"); - if ((eventSlave.fetish === "boobs") && (eventSlave.fetishKnown === 1)) { + if (eventSlave.fetish === "boobs" && eventSlave.fetishKnown === 1) { eventSlave.fetishStrength += 4; r.push(`<span class="fetish inc">${His} enjoyment of breast play has increased.</span>`); + } else if (eventSlave.fetish === "boobs") { + eventSlave.fetishKnown = 1; + r.push(`<span class="fetish gain">${His} enjoyment of breast play is now clear to you.</span>`); } else if (random(1, 100) > 50) { eventSlave.fetish = "boobs"; eventSlave.fetishKnown = 1; @@ -324,9 +396,12 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A r.push(`popped`); } r.push(`navel as ${he} comes down from ${his} masturbation session.`); - if ((eventSlave.fetish === "pregnancy") && (eventSlave.fetishKnown === 1)) { + if (eventSlave.fetish === "pregnancy" && eventSlave.fetishKnown === 1) { eventSlave.fetishStrength += 4; - r.push(`<span class="lightcoral">${His} enjoyment of pregnancy has increased.</span>`); + r.push(`<span class="fetish inc">${His} enjoyment of pregnancy has increased.</span>`); + } else if (eventSlave.fetish === "pregnancy") { + eventSlave.fetishKnown = 1; + r.push(`<span class="fetish gain">${His} enjoyment of pregnancy is now clear to you.</span>`); } else if (random(1, 100) > 50) { eventSlave.fetish = "pregnancy"; eventSlave.fetishKnown = 1; @@ -337,7 +412,7 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A } else { r.push(`the very thought of being pregnant`); } - r.push(`.</span>`); + r.push(r.pop() + `.</span>`); } return r; } @@ -393,9 +468,12 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A } r.push(`up ${his} butt. Soon, ${he}'s down on all fours, crying a little with mixed shame and anal pain as ${he} masturbates furiously.`); r.push(VCheck.Anal(eventSlave, 5)); - if ((eventSlave.fetish === "buttslut") && (eventSlave.fetishKnown === 1)) { + if (eventSlave.fetish === "buttslut" && eventSlave.fetishKnown === 1) { eventSlave.fetishStrength += 4; r.push(`<span class="fetish inc">${His} enjoyment of anal has increased.</span>`); + } else if (eventSlave.fetish === "buttslut") { + eventSlave.fetishKnown = 1; + r.push(`<span class="fetish gain">${His} enjoyment of anal is now clear to you.</span>`); } else if (random(1, 100) > 50) { eventSlave.fetish = "buttslut"; eventSlave.fetishKnown = 1; @@ -414,9 +492,12 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A r.push(`onto the street`); } r.push(`and secure ${him} upright with a set of vibrators attached to all of ${his} erogenous zones. There's a lot of them, and they're extremely powerful; when you test the setup, ${he} wriggles with the intensity of the stimulation, and is about to climax when you shut it down. Without telling ${him}, you slave the vibrators to a program originally designed for VIP security details. It uses the cameras scattered through the area to detect when passersby are looking at ${him}. The more eyes on ${him}, the stronger the vibrations.`); - if ((eventSlave.fetish === "humiliation") && (eventSlave.fetishKnown === 1)) { + if (eventSlave.fetish === "humiliation" && eventSlave.fetishKnown === 1) { eventSlave.fetishStrength += 4; r.push(`<span class="fetish inc">${His} enjoyment of humiliation has increased.</span>`); + } else if (eventSlave.fetish === "humiliation") { + eventSlave.fetishKnown = 1; + r.push(`<span class="fetish gain">${His} enjoyment of humiliation is now clear to you.</span>`); } else if (random(1, 100) > 50) { eventSlave.fetish = "humiliation"; eventSlave.fetishKnown = 1; @@ -435,9 +516,12 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A r.push(`and a shriek of agony.`); } r.push(`${He} masturbates furiously, but you're an accomplished spanker, and you repeatedly cause ${him} just enough pain to prevent climax. Eventually ${he} gets off in part because of, rather than in spite of, the lengthy beating.`); - if ((eventSlave.fetish === "submissive") && (eventSlave.fetishKnown === 1)) { + if (eventSlave.fetish === "submissive" && eventSlave.fetishKnown === 1) { eventSlave.fetishStrength += 4; r.push(`<span class="fetish inc">${His} enjoyment of submission has increased.</span>`); + } else if (eventSlave.fetish === "submissive") { + eventSlave.fetishKnown = 1; + r.push(`<span class="fetish gain">${His} enjoyment of submission is now clear to you.</span>`); } else if (random(1, 100) > 50) { eventSlave.fetish = "submissive"; eventSlave.fetishKnown = 1; @@ -450,9 +534,9 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A function pain() { r = []; r.push(`You order ${him} to`); - if ((eventSlave.heels === 1) && shoeHeelCategory(eventSlave) === 0) { + if ((eventSlave.heels === 1 && shoeHeelCategory(eventSlave) === 0) || !canStand(eventSlave)) { r.push(`kneel`); - } else if (shoeHeelCategory(eventSlave) > 1) { + } else if (shoeHeelCategory(eventSlave) > 1 || canMove(eventSlave)) { r.push(`teeter`); } else { r.push(`stand`); @@ -468,14 +552,30 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A r.push(`over ${his} head and ${his} leg bent,`); } r.push(`and tell ${him} that if ${he} moves or resists, ${his} punishment will begin again from the start.`); - if ((eventSlave.chastityVagina) || (eventSlave.chastityPenis === 1)) { - r.push(`${He} was touching ${his} nipples and ass, so you flick and torture ${his} nipples and give ${him} a severe spanking.`); - } else if (!canAchieveErection(eventSlave) && (eventSlave.dick > 6)) { + if ((eventSlave.chastityVagina || eventSlave.chastityPenis === 1)) { + if (offHand === "anal") { + r.push(`${He} was touching ${his} nipples and ass, so you flick and torture ${his} nipples and give ${him} a severe spanking.`); + } else { + r.push(`${He} was playing with ${his} nipples, so you flick and torture them, enjoying ${his} agony.`); + } + } else if (!canAchieveErection(eventSlave) && eventSlave.dick > 6) { r.push(`${He} was playing with ${his} oversized cock, so you kick and swat at the swollen monster, enjoying the way it spasms.`); - } else if ((eventSlave.dick > 0) && !canAchieveErection(eventSlave)) { - r.push(`${He} was touching ${his} limp dick and ass, so you slap and torture ${his} offending dick and give ${him} a severe spanking.`); - } else if ((eventSlave.vagina === -1) && (eventSlave.dick === 0)) { - r.push(`${He} was desperately rubbing ${his} perineum and anus, the most sensitive parts ${he} has left, so you slap that part of ${him} repeatedly, enjoying the way it spasms.`); + } else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) { + if (offHand === "anal") { + r.push(`${He} was touching ${his} limp dick and ass, so you slap and torture ${his} offending dick and give ${him} a severe spanking.`); + } else if (offHand === "pussy") { + r.push(`${He} was touching ${his} limp dick and pussy, so you slap and torture ${his} offending dick and labia.`); + } else if (offHand === "nipples") { + r.push(`${He} was playing with ${his} limp dick and nipples, so you slap and torture ${his} offending dick while pinching and twisting nipples.`); + } else { + r.push(`${He} was playing with ${his} limp dick, so you slap and torture ${his} worthless cock, enjoying ${his} agony.`); + } + } else if (eventSlave.vagina === -1 && eventSlave.dick === 0) { + if (offHand === "anal") { + r.push(`${He} was desperately rubbing ${his} perineum and anus, the most sensitive parts ${he} has left, so you slap that part of ${him} repeatedly, enjoying the way it spasms.`); + } else if (offHand === "nipples") { + r.push(`${He} was desperately rubbing ${his} perineum and nipples, the most sensitive parts ${he} has left, so you slap those parts of ${him} repeatedly, enjoying the way they spasm.`); + } } else if (eventSlave.vagina === -1 || eventSlave.clit >= 3) { r.push(`${He} was jacking it, so you force ${him} to get ${himself} hard for punishment and then deliver a series of agonizing slaps and flicks to ${his} offending member.`); } else if (eventSlave.labia > 1) { @@ -483,11 +583,14 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A } else { r.push(`You deliver a series of agonizing slaps to ${his} mons.`); } - r.push(`You have to start over twice. By the end, ${he}'s managed to orgasm to all the stimulation, but ${he}'s crying and desperately promising never to touch ${himself} again without your permission. ${His} submission to you <span class="hotpink">has increased.</span>`); + r.push(`You have to start over twice. By the end, ${he}'s managed to orgasm to all the stimulation, but ${he}'s crying and desperately promising never to touch ${himself} again without your permission. ${His} submission to you <span class="devotion inc">has increased.</span>`); eventSlave.devotion += 4; - if ((eventSlave.fetish === "masochist") && (eventSlave.fetishKnown === 1)) { + if (eventSlave.fetish === "masochist" && eventSlave.fetishKnown === 1) { eventSlave.fetishStrength += 4; r.push(`<span class="fetish inc">${His} enjoyment of pain has increased.</span>`); + } else if (eventSlave.fetish === "masochist") { + eventSlave.fetishKnown = 1; + r.push(`<span class="fetish gain">${His} enjoyment of pain is now clear to you.</span>`); } else if (random(1, 100) > 50) { eventSlave.fetish = "masochist"; eventSlave.fetishKnown = 1;