diff --git a/CHANGELOG.md b/CHANGELOG.md index 1797210d503f6dab04031435140003e4b3006d17..715bcd2c68a489277524bf2777124b109f7c0521 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## Unreleased +* Arcade DOM conversion + ## 0.10.7.1-4.0.0-alpha.4 - 2021-06-26 * Implementation of Facility class (technical stuff) diff --git a/src/events/RE/reAnalPunishment.js b/src/events/RE/reAnalPunishment.js index 46de3561dd38908cf895fb3b8a6361cda292d274..215afe2d4572bfad2f08b6c78c263ce570812979 100644 --- a/src/events/RE/reAnalPunishment.js +++ b/src/events/RE/reAnalPunishment.js @@ -12,9 +12,11 @@ App.Events.REAnalPunishment = class REAnalPunishment extends App.Events.BaseEven (s) => s.anus !== 0, (s) => s.fetish !== "mindbroken", canDoAnal, - hasAnyLegs, + canMove, hasAnyArms, canTalk, + canHear, + canSee ]]; } @@ -29,6 +31,7 @@ App.Events.REAnalPunishment = class REAnalPunishment extends App.Events.BaseEven He, His, he, his, him, himself, girl, woman } = getPronouns(slave); + const belly = bellyAdjective(slave); const {title: Master} = getEnunciation(slave); @@ -58,10 +61,16 @@ App.Events.REAnalPunishment = class REAnalPunishment extends App.Events.BaseEven } else if (slave.boobs > 1000) { r.push(`The weight of the supplicant's breasts is quite noticeable as ${his} embrace of your leg presses them against it.`); } - r.push(`You look down at ${slave.slaveName}. ${He} stares back with huge wet ${App.Desc.eyesColor(slave)}, doing ${his} best to implore you with ${his} gaze, and scooting ${his} rear in towards your foot in an unconscious effort to protect it from the promised assrape. ${He}'s quite authentically terrified; ${his} whole body is shaking.`); + r.push(`You look down at ${slave.slaveName}. ${He} stares back with huge wet ${App.Desc.eyesColor(slave)}, doing ${his} best to implore you with ${his} gaze, and`); + if (slave.belly < 10000) { + r.push(`scooting ${his} rear in towards your foot`); + } else { + r.push(`struggling to hide ${his} rear`); + } + r.push(`in an unconscious effort to protect it from the promised assrape. ${He}'s quite authentically terrified; ${his} whole body is shaking.`); App.Events.addParagraph(node, r); r = []; - r.push(`${S.HeadGirl.slaveName} is very much acting within ${his2} duties, and ${slave.slaveName} has now misbehaved twice by trying to go over your Head Girl's head by appealing to you. ${S.HeadGirl.slaveName} is ready to carry out the sentence: `); + r.push(`${S.HeadGirl.slaveName} is very much acting within ${his2} duties, and ${slave.slaveName} has now misbehaved twice by trying to go over your Head Girl's head by appealing to you. ${S.HeadGirl.slaveName} is ready to carry out the sentence:`); if (canPenetrate(S.HeadGirl) && (S.HeadGirl.dick > 2)) { r.push(`${his2} cock is fully erect, and ${he2}'s keeping it hard with one hand. ${He2} slaps its head against ${his2} other palm,`); } else if (S.HeadGirl.dick > 0) { @@ -89,11 +98,8 @@ App.Events.REAnalPunishment = class REAnalPunishment extends App.Events.BaseEven r.push(`${girl}`); } r.push(`is clinging to your leg — and tell ${S.HeadGirl.slaveName} to carry on. Your Head Girl <span class="trust inc">puffs up a bit with pride,</span> and orders the weeping slave to present ${his} anus. The ${(slave.physicalAge > 30) ? woman : girl} does not resist, but nor does ${he} comply. ${S.HeadGirl.slaveName} jabs a thumb into ${slave.slaveName}'s side, right above ${his} kidney, driving the wind out of the slave with a pained grunt. ${He} arches ${his} back involuntarily and ${his} grip on you loosens, and ${S.HeadGirl.slaveName} drags ${him} off you. ${He2} jabs ${him} again, depriving ${his2} victim of breath completely, and then takes ${him2} by the ankle, dragging the slave across the floor with comic effect. The slave leaves a trail of tears across the flooring as ${he} vanishes into the room. As you continue making your rounds, you hear a drawn-out howl followed by rhythmic screaming.`); - slave.counter.anal += 1; - V.analTotal += 1; + seX(slave, "anal", S.HeadGirl, "penetrative", 1); S.HeadGirl.trust += 4; - S.HeadGirl.counter.penetrative += 1; - V.penetrativeTotal += 1; App.Events.addParagraph(frag, r); return frag; @@ -102,7 +108,13 @@ App.Events.REAnalPunishment = class REAnalPunishment extends App.Events.BaseEven function takePart() { const frag = new DocumentFragment(); let r = []; - r.push(`You explain ${slave.slaveName}'s double crime to ${him}, and tell ${S.HeadGirl.slaveName} to get started. Your Head Girl orders the weeping slave to present ${his} anus. The ${(slave.physicalAge > 30) ? woman : girl} does not resist, but nor does ${he} comply. ${S.HeadGirl.slaveName} jabs a thumb into ${slave.slaveName}'s side, right above ${his} kidney, driving the wind out of the slave with a pained grunt. ${He} arches ${his} back involuntarily and ${his} grip on you loosens, so${S.HeadGirl.slaveName} drags ${him} off you, telling ${slave.slaveName} that it'll hurt less if ${he} cooperates and assumes the proper position. ${He} doesn't, so ${S.HeadGirl.slaveName} assfucks ${him} lying flat on the floor, with the poor ${girl} sobbing loudly as ${S.HeadGirl.slaveName}`); + r.push(`You explain ${slave.slaveName}'s double crime to ${him}, and tell ${S.HeadGirl.slaveName} to get started. Your Head Girl orders the weeping slave to present ${his} anus. The ${(slave.physicalAge > 30) ? woman : girl} does not resist, but nor does ${he} comply. ${S.HeadGirl.slaveName} jabs a thumb into ${slave.slaveName}'s side, right above ${his} kidney, driving the wind out of the slave with a pained grunt. ${He} arches ${his} back involuntarily and ${his} grip on you loosens, so${S.HeadGirl.slaveName} drags ${him} off you, telling ${slave.slaveName} that it'll hurt less if ${he} cooperates and assumes the proper position. ${He} doesn't, so ${S.HeadGirl.slaveName}`); + if (slave.belly < 1500) { + r.push(`assfucks ${him} lying flat on the floor,`); + } else { + r.push(`painfully assfucks ${him} against ${his} ${belly} middle.`); + } + r.push(`with the poor ${girl} sobbing loudly as ${S.HeadGirl.slaveName}`); if (canPenetrate(S.HeadGirl) && (S.HeadGirl.dick > 2)) { r.push(`pistons ${his2} cock in and out of ${his} rectum.`); } else { @@ -152,6 +164,7 @@ App.Events.REAnalPunishment = class REAnalPunishment extends App.Events.BaseEven ); seX(slave, "anal", S.HeadGirl, "penetrative"); + seX(slave, "anal", V.PC, "penetrative"); S.HeadGirl.devotion += 4; slave.trust -= 5; diff --git a/src/events/RE/reLegendaryBalls.js b/src/events/RE/reLegendaryBalls.js index 5775686a99baf2c9167f7546897891c156f5d946..bca2c78eb7ee2bac005787cf9bcd51066598faa8 100644 --- a/src/events/RE/reLegendaryBalls.js +++ b/src/events/RE/reLegendaryBalls.js @@ -7,7 +7,7 @@ App.Events.RELegendaryBalls = class RELegendaryBalls extends App.Events.BaseEven canTalk, (s) => s.devotion > 50, (s) => s.prestige === 0, - (s) => (s.balls > 5 || (s.balls > 4 && s.prostate > 1)), + (s) => (s.balls > 5 || (s.balls > 4 && s.prostate > 1)), // should probably have a cumAmount() check? (s) => s.dick !== 0, (s) => [Job.DAIRY, Job.MILKED].includes(s.assignment) ]]; diff --git a/src/events/RE/reLegendaryCow.js b/src/events/RE/reLegendaryCow.js index 10fedf14f72b927184f0970e1efd1ec9de5413c6..5118b37c8f77f918bcf6f275d0ec0d0b73d4e3ab 100644 --- a/src/events/RE/reLegendaryCow.js +++ b/src/events/RE/reLegendaryCow.js @@ -8,7 +8,7 @@ App.Events.RELegendaryCow = class RELegendaryCow extends App.Events.BaseEvent { (s) => s.devotion > 50, (s) => s.prestige === 0, (s) => s.lactation > 0, - (s) => (s.boobs - s.boobsImplant - s.boobsMilk) > 6000, + (s) => (s.boobs - s.boobsImplant - s.boobsMilk) > 6000, // should probably have a milkAmount() check? (s) => [Job.DAIRY, Job.MILKED].includes(s.assignment) ]]; } diff --git a/src/events/RE/reLegendaryEntertainer.js b/src/events/RE/reLegendaryEntertainer.js index 48abae9b09180c576a86e75d80e9b404e947d669..6b0e4769f2ed1b4e3f519b12756138ad59690d47 100644 --- a/src/events/RE/reLegendaryEntertainer.js +++ b/src/events/RE/reLegendaryEntertainer.js @@ -3,12 +3,13 @@ App.Events.RELegendaryEntertainer = class RELegendaryEntertainer extends App.Eve return [[ (s) => s.fetish !== "mindbroken", hasAnyArms, - hasAnyLegs, + canWalk, canTalk, (s) => s.devotion > 50, (s) => s.trust > 50, (s) => s.prestige === 0, (s) => s.skill.entertainment >= 100, + (s) => (canDoAnal(s) && s.anus > 0) || (canDoVaginal(s) && s.vagina > 0), (s) => [Job.CLUB, Job.DJ].includes(s.assignment) ]]; } diff --git a/src/events/RE/reLegendaryFormerAbolitionist.js b/src/events/RE/reLegendaryFormerAbolitionist.js index 6f63570b007820d8740a60cd656182786c998d47..a8f5a11e26a97c95d659db11a50f027762e09cab 100644 --- a/src/events/RE/reLegendaryFormerAbolitionist.js +++ b/src/events/RE/reLegendaryFormerAbolitionist.js @@ -3,7 +3,7 @@ App.Events.RELegendaryFormerAbolitionist = class RELegendaryFormerAbolitionist e return [[ (s) => s.fetish !== "mindbroken", hasAnyArms, - hasAnyLegs, + canWalk, canTalk, (s) => s.devotion > 95, (s) => s.trust > 50, @@ -15,6 +15,7 @@ App.Events.RELegendaryFormerAbolitionist = class RELegendaryFormerAbolitionist e "$He is an enslaved member of an anti-slavery extremist group.", ].includes(s.origin) || s.career === "an antislavery activist", + s.newGamePlus === 0, (s) => [Job.MASTERSUITE, Job.CONCUBINE, Job.FUCKTOY].includes(s.assignment) ]]; } diff --git a/src/events/RE/reLegendaryWhore.js b/src/events/RE/reLegendaryWhore.js index 669989ab2a109ff9af060711fbd46d2f14f89ae2..2b8349e86c44a0de01f919a01cdc7c2387579232 100644 --- a/src/events/RE/reLegendaryWhore.js +++ b/src/events/RE/reLegendaryWhore.js @@ -3,12 +3,13 @@ App.Events.RELegendaryWhore = class RELegendaryWhore extends App.Events.BaseEven return [[ (s) => s.fetish !== "mindbroken", hasAnyArms, - hasAnyLegs, + canWalk, canTalk, (s) => s.devotion > 50, (s) => s.trust > 50, (s) => s.prestige === 0, (s) => s.skill.whoring >= 100, + (s) => (canDoAnal(s) && s.anus > 0) || (canDoVaginal(s) && s.vagina > 0), (s) => [Job.WHORE, Job.BROTHEL].includes(s.assignment) ]]; } diff --git a/src/events/RE/reLegendaryWomb.js b/src/events/RE/reLegendaryWomb.js index e7dac1404850735ff2db810259490cdfa573ea54..ffe207d2f47f57b62644320fcb54557c1608dea3 100644 --- a/src/events/RE/reLegendaryWomb.js +++ b/src/events/RE/reLegendaryWomb.js @@ -3,7 +3,7 @@ App.Events.RELegendaryWomb = class RELegendaryWomb extends App.Events.BaseEvent return [[ (s) => s.fetish !== "mindbroken", hasAnyArms, - hasAnyLegs, + canMove, canTalk, (s) => s.devotion > 50, (s) => s.trust > 50, @@ -62,13 +62,13 @@ App.Events.RELegendaryWomb = class RELegendaryWomb extends App.Events.BaseEvent const frag = new DocumentFragment(); let r = []; if (random(1, 100) > 90) { - r.push(`${slave.slaveName} is shown in public, closely inspected by the judging committee, and then asked to demonstrate how to pleasure a man while so heavily pregnant. It's likely there was some bribery behind the scenes, but ${his} heavy belly and creative positions win the day. Against all odds ${he} is named best in show, and will be <span class="green">remembered</span> as a breeder of the highest pedigree. As ${his} owner, your reputation has <span class="green">also increased.</span>`); + r.push(`${slave.slaveName} is shown in public, closely inspected by the judging committee, and then asked to demonstrate how to pleasure a man while so heavily pregnant. It's likely there was some bribery behind the scenes, but ${his} heavy belly and creative positions win the day. Against all odds ${he} is named best in show, and will be <span class="prestigious">remembered</span> as a breeder of the highest pedigree. As ${his} owner, your reputation has <span class="reputation inc">also increased.</span>`); repX(500, "event", slave); slave.prestige = 1; slave.prestigeDesc = "$He is remembered for winning best in show as a breeder."; V.trinkets.push(`a best in show ribbon awarded to ${slave.slaveName} as a breeder`); } else { - r.push(`${slave.slaveName} is shown in public, closely inspected by the judging committee, and then asked to demonstrate how to pleasure a man while so heavily pregnant. It's likely there was some bribery behind the scenes, and it is fatal to ${his} chances of winning. Though ${his} pregnant body is the most impressive on display, another slaveowner who was more open-handed with the judges took best in show. The public is impressed with ${slave.slaveName}'s reproductive capability anyway; as you are ${his} owner, your reputation has <span class="green">increased</span> a little.`); + r.push(`${slave.slaveName} is shown in public, closely inspected by the judging committee, and then asked to demonstrate how to pleasure a man while so heavily pregnant. It's likely there was some bribery behind the scenes, and it is fatal to ${his} chances of winning. Though ${his} pregnant body is the most impressive on display, another slaveowner who was more open-handed with the judges took best in show. The public is impressed with ${slave.slaveName}'s reproductive capability anyway; as you are ${his} owner, your reputation has <span class="reputation inc">increased</span> a little.`); repX(500, "event", slave); } App.Events.addParagraph(frag, r); diff --git a/src/events/RE/reRebels.js b/src/events/RE/reRebels.js index 1307aff535b1e64dd87f27e9809b09546a3eda05..6ca76caecfb51bc84fec63cb3fd999b0c23c0f4a 100644 --- a/src/events/RE/reRebels.js +++ b/src/events/RE/reRebels.js @@ -8,6 +8,10 @@ App.Events.RERebels = class RERebels extends App.Events.BaseEvent { (s) => !jobs.includes(s.assignment), (s) => s.devotion < -20, canWalk, + hasAnyArms, + canTalk, + canSee, + canHear ]; return [req, req]; } @@ -86,35 +90,15 @@ App.Events.RERebels = class RERebels extends App.Events.BaseEvent { function deathMatch() { const frag = new DocumentFragment(); let r = []; - r.push(`You haul your bound little rebel bitches into one of the deepest, most out of the way rooms of your penthouse with bags over their heads. When you pull them off, they are met with`); - if (canSee(thingTwo) && canSee(thingOne)) { - r.push(`the sight of`); - } - r.push(`a gallows, complete with a pair of nooses. You haul them, one at a time up onto a stool and loop the rope around their necks. They scream and beg the whole time for you to reconsider, before turning on each other to try and avoid their fate. It won't be that easy for them. You hold up a pair of spoons and explain the rules of the game. They'll hold them in their pussies, and whoever loses their grip and drops it first, dies.`); + r.push(`You haul your bound little rebel bitches into one of the deepest, most out of the way rooms of your penthouse with bags over their heads. When you pull them off, they are met with the sight of a gallows, complete with a pair of nooses. You haul them, one at a time, up onto a stool and loop the rope around their necks. They scream and beg the whole time for you to reconsider, before turning on each other to try and avoid their fate. It won't be that easy for them. You hold up a pair of spoons and explain the rules of the game. They'll hold them in their pussies, and whoever loses their grip and drops it first, dies.`); App.Events.addParagraph(frag, r); r = []; if (thingOne.vagina > 3) { - r.push(`You start with ${thingOne.slaveName} and no sooner than you turn to ${thingTwo.slaveName} do you hear the telltale clatter of the spoon hitting the floor. With a simple kick, the unfortunately loose ${thingOne.slaveName} is left struggling in the air. ${thingTwo.slaveName}`); - if (canSee(thingTwo)) { - r.push(`watches`); - } else if (canHear(thingTwo)) { - r.push(`listens`); - } else { - r.push(`stares blankly`); - } - r.push(`in horror as the life drains from ${his2} former accomplice. <span class="trust dec">${He2} promises to never cross you again.</span>`); + r.push(`You start with ${thingOne.slaveName} and no sooner than you turn to ${thingTwo.slaveName} do you hear the telltale clatter of the spoon hitting the floor. With a simple kick, the unfortunately loose ${thingOne.slaveName} is left struggling in the air. ${thingTwo.slaveName} watches in horror as the life drains from ${his2} former accomplice. <span class="trust dec">${He2} promises to never cross you again.</span>`); thingTwo.trust -= 20; removeSlave(thingOne); } else if (thingTwo.vagina > 3) { - r.push(`You start with ${thingOne.slaveName} before moving to ${thingTwo.slaveName} as ${he} holds ${his} life between ${his} netherlips. Setting the spoon inside ${thingTwo.slaveName}, you prepare to kick the stools out from under them; but the telltale clatter of the spoon hitting the floor saves you the trouble. With a simple kick, the unfortunately loose ${thingTwo.slaveName} is left struggling in the air. ${thingOne.slaveName}`); - if (canSee(thingOne)) { - r.push(`watches`); - } else if (canHear(thingOne)) { - r.push(`listens`); - } else { - r.push(`stares blankly`); - } - r.push(`in horror as the life drains from ${his} former accomplice. <span class="trust dec">${He} promises to never cross you again.</span>`); + r.push(`You start with ${thingOne.slaveName} before moving to ${thingTwo.slaveName} as ${he} holds ${his} life between ${his} netherlips. Setting the spoon inside ${thingTwo.slaveName}, you prepare to kick the stools out from under them; but the telltale clatter of the spoon hitting the floor saves you the trouble. With a simple kick, the unfortunately loose ${thingTwo.slaveName} is left struggling in the air. ${thingOne.slaveName} watches in horror as the life drains from ${his} former accomplice. <span class="trust dec">${He} promises to never cross you again.</span>`); thingOne.trust -= 20; removeSlave(thingTwo); } else if (random(1, 100) === 69) { @@ -147,15 +131,7 @@ App.Events.RERebels = class RERebels extends App.Events.BaseEvent { } } } else { - r.push(`You start with ${thingOne.slaveName} before moving to ${thingTwo.slaveName} as ${he} holds ${his} life between ${his} netherlips. Once both spoons are inserted, you sit back and watch them squirm at the cold metal in their most sensitive recesses. In a show of underhandedness, ${thingTwo.slaveName} kicks ${thingOne.slaveName}, knocking ${him} off balance and sending ${him} hanging. ${thingTwo.slaveName}`); - if (canSee(thingTwo)) { - r.push(`watches`); - } else if (canHear(thingTwo)) { - r.push(`listens`); - } else { - r.push(`stares blankly`); - } - r.push(`as the life drains from ${his2} accomplice, <span class="trust dec">horrified at what ${he2} just did.</span> The ordeal <span class="red">leaves ${him2} behaving strangely.</span>`); + r.push(`You start with ${thingOne.slaveName} before moving to ${thingTwo.slaveName} as ${he} holds ${his} life between ${his} netherlips. Once both spoons are inserted, you sit back and watch them squirm at the cold metal in their most sensitive recesses. In a show of underhandedness, ${thingTwo.slaveName} kicks ${thingOne.slaveName}, knocking ${him} off balance and sending ${him} hanging. ${thingTwo.slaveName} watches as the life drains from ${his2} accomplice, <span class="trust dec">horrified at what ${he2} just did.</span> The ordeal <span class="red">leaves ${him2} behaving strangely.</span>`); thingTwo.trust = -100; thingTwo.behavioralFlaw = "odd"; removeSlave(thingOne); @@ -174,15 +150,7 @@ App.Events.RERebels = class RERebels extends App.Events.BaseEvent { const {his2, him2} = getPronouns(survivor).appendSuffix("2"); const frag = new DocumentFragment(); let r = []; - r.push(`You kick the stool out from under ${dead.slaveName} and let ${him} hang. ${survivor.slaveName}`); - if (canSee(survivor)) { - r.push(`watches`); - } else if (canHear(survivor)) { - r.push(`listens`); - } else { - r.push(`stares blankly`); - } - r.push(`in horror as the life drains from ${his2} former accomplice, <span class="trust dec">terrified that you'd so callously toy with their lives.</span> The ordeal <span class="red">leaves ${him2} behaving strangely.</span>`); + r.push(`You kick the stool out from under ${dead.slaveName} and let ${him} hang. ${survivor.slaveName} watches in horror as the life drains from ${his2} former accomplice, <span class="trust dec">terrified that you'd so callously toy with their lives.</span> The ordeal <span class="red">leaves ${him2} behaving strangely.</span>`); App.Events.addParagraph(frag, r); survivor.trust -= -20; survivor.behavioralFlaw = "odd"; diff --git a/src/events/RE/reRelationshipAdvice.js b/src/events/RE/reRelationshipAdvice.js index 126f914f5710ee40efce36001636081c848d7ed5..5a4a35ce3c7a492cfca31c9bb136a30c0c71b3c4 100644 --- a/src/events/RE/reRelationshipAdvice.js +++ b/src/events/RE/reRelationshipAdvice.js @@ -3,8 +3,9 @@ App.Events.RERelationshipAdvice = class RERelationshipAdvice extends App.Events return[[ (s) => s.fetish !== "mindbroken", hasAnyArms, - hasAnyLegs, + canWalk, canTalk, + canSee, (s) => s.assignment !== Job.QUARTER, (s) => s.relationship >= 2, (s) => s.relationship < 5, @@ -70,12 +71,7 @@ App.Events.RERelationshipAdvice = class RERelationshipAdvice extends App.Events if (!canSee(slave)) { r.push(`blankly`); } - if (hasBothLegs(slave)) { - r.push(`at ${his} feet.`); - } else { - r.push(`downwards.`); - } - r.push(`Comprehension dawning, you ask ${him} if`); + r.push(`at ${his} feet. Comprehension dawning, you ask ${him} if`); if (slave.relationship === 2) { r.push(`${he} wants to be more than friends with ${relSlave.slaveName}.`); } else if (slave.relationship === 3) { @@ -87,12 +83,7 @@ App.Events.RERelationshipAdvice = class RERelationshipAdvice extends App.Events if (!canSee(slave)) { r.push(`blankly`); } - if (hasBothLegs(slave)) { - r.push(`at ${his} feet.`); - } else { - r.push(`downwards.`); - } - r.push(`${He} shuts ${his} eyes tight and waits for you to weigh in on the situation.`); + r.push(`at ${his} feet. ${He} shuts ${his} eyes tight and waits for you to weigh in on the situation.`); App.Events.addParagraph(node, r); const choices = []; @@ -167,72 +158,93 @@ App.Events.RERelationshipAdvice = class RERelationshipAdvice extends App.Events ); if (slave.relationship === 2) { - if (slave.fetishKnown === 1 && slave.fetish === "buttslut") { + if (slave.fetish === "buttslut") { r.push( Spoken(slave, `to fuck your butt."`), `${relSlave.slaveName} looks relieved that that's all it is, and ${agrees()}`, ); r.push(`${He2} kisses ${slave.slaveName} and then grinds ${his2} ass against ${slave.slaveName}'s crotch.`); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "cumslut")) { - if (relSlave.vagina !== -1) { + } else if (slave.fetish === "cumslut") { + if (relSlave.dick === 0) { r.push(`to eat you out."`); } else { r.push(`to blow you."`); } r.push(`${relSlave.slaveName} looks relieved that that's all it is, and ${agrees()} ${He2}`); - if (relSlave.vagina !== -1) { + if (relSlave.dick === 0) { r.push(`offers ${his2} pussy`); } else { r.push(`flops ${his2} dick at ${slave.slaveName}`); } r.push(`comically.`); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "humiliation")) { + } else if (slave.fetish === "humiliation") { r.push( Spoken(slave, `to fuck you in public."`), ` ${relSlave.slaveName} looks relieved that that's all it is, and ${agrees()}` ); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "masochist")) { + } else if (slave.fetish === "masochist") { r.push( Spoken(slave, `you to hurt me. Like, really hurt me."`), ` ${relSlave.slaveName} looks relieved that that's all it is, and ${agrees()} ${He2} pinches one of ${slave.slaveName}'s nipples experimentally.` ); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "sadist")) { + } else if (slave.fetish === "sadist") { r.push( Spoken(slave, `to hold you down."`), - ` ${relSlave.slaveName} looks relieved that that's all it is, and ${agrees()} ${He2} steps in close to ${slave.slaveName}, takes ${slave.slaveName}'s ${hasBothArms(slave) ? "hands" : "hand"}, and places them around ${his2} own throat.` + ` ${relSlave.slaveName} looks relieved that that's all it is, and ${agrees()} ${He2} ${canWalk(relSlave) ? "steps in close" : "wiggles closer"} to ${slave.slaveName},` ); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "dom")) { + if (hasAnyArms(relSlave)) { + r.push(`takes ${slave.slaveName}'s ${hasBothArms(slave) ? "hands, and places them" : "hand, and places it"} around ${his2} own throat.`); + } else { + r.push(`and sticks out ${his2} neck for ${slave.slaveName}`); + } + } else if (slave.fetish === "dom") { r.push( Spoken(slave, `to be your top."`), ` ${relSlave.slaveName} looks relieved that that's all it is, and ${agrees()} ${He2} sidles up to ${slave.slaveName}, looking up at ${him} submissively.` ); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "submissive")) { + } else if (slave.fetish === "submissive") { r.push( Spoken(slave, `to be your bottom."`), - ` ${relSlave.slaveName} looks relieved that that's all it is, and says, ${agrees()} ${He2} takes ${slave.slaveName}'s face in ${his2} ${hasBothArms(relSlave) ? "hands" : "hand"} and kisses ${him} dominantly.` + ` ${relSlave.slaveName} looks relieved that that's all it is, and says, ${agrees()} ` ); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "boobs")) { + if (hasAnyArms(relSlave)) { + r.push(`${He2} takes ${slave.slaveName}'s face in ${his2} ${hasBothArms(relSlave) ? "hands" : "hand"}`); + } else { + r.push(`${He2} leans in`); + } + r.push(` and kisses ${him} dominantly.`); + } else if (slave.fetish === "boobs") { r.push( Spoken(slave, `to fuck your boobs."`), - `${relSlave.slaveName} looks relieved that that's all it is, and says, ${agrees()} ${He2} takes ${slave.slaveName}'s` + `${relSlave.slaveName} looks relieved that that's all it is, and says, ${agrees()}` ); - if (hasBothArms(slave)) { - r.push(`hands and places them`); + if (hasAnyArms(relSlave)) { + r.push(`${He2} takes ${slave.slaveName}'s`); + if (hasBothArms(slave)) { + r.push(`hands and places them`); + } else { + r.push(`hand and places it`); + } + r.push(`right on ${his2} breasts.`); } else { - r.push(`hand and places it`); + r.push(`${He2} sticks out ${his2} breasts for ${slave.slaveName} and is not disappointed.`); } - r.push(`right on ${his2} breasts.`); } else { r.push( Spoken(slave, `to fuck you."`), - ` ${relSlave.slaveName} looks relieved that that's all it is, and ${agrees()} ${He2} takes ${slave.slaveName}'s` + ` ${relSlave.slaveName} looks relieved that that's all it is, and ${agrees()}` ); - if (hasBothArms(slave)) { - r.push(`hands and places them`); + if (hasAnyArms(relSlave)) { + r.push(`${He2} takes ${slave.slaveName}'s`); + if (hasBothArms(slave)) { + r.push(`hands and places them`); + } else { + r.push(`hand and places it`); + } + r.push(`right on ${his2} breasts.`); } else { - r.push(`hand and places it`); + r.push(`${He2} sticks out ${his2} breasts for ${slave.slaveName} and is not disappointed.`); } - r.push(`right on ${his2} breasts.`); } r.push(`${slave.slaveName} bursts out laughing. They're now <span class="relationship">friends with benefits.</span>`); } else if (slave.relationship === 3) { @@ -241,26 +253,25 @@ App.Events.RERelationshipAdvice = class RERelationshipAdvice extends App.Events `${He} takes a deep breath.`, Spoken(slave, `"It's fun, just`) ); - if (slave.fetishKnown === 1 && slave.fetish === "buttslut") { + if (slave.fetish === "buttslut") { r.push(`fucking your butt.`); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "cumslut")) { - r.push(`to`); - if (relSlave.vagina !== -1) { + } else if (slave.fetish === "cumslut") { + if (relSlave.dick === 0) { r.push(`eating you out.`); } else { r.push(`blowing you.`); } - } else if ((slave.fetishKnown === 1) && (slave.fetish === "humiliation")) { + } else if (slave.fetish === "humiliation") { r.push(`fucking you in public.`); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "masochist")) { + } else if (slave.fetish === "masochist") { r.push(`having you hurt me.`); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "sadist")) { + } else if (slave.fetish === "sadist") { r.push(`holding you down.`); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "dom")) { + } else if (slave.fetish === "dom") { r.push(`topping you.`); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "submissive")) { + } else if (slave.fetish === "submissive") { r.push(`being your bottom.`); - } else if ((slave.fetishKnown === 1) && (slave.fetish === "boobs")) { + } else if (slave.fetish === "boobs") { r.push(`fucking your boobs.`); } else { r.push(`having sex with you.`); @@ -278,18 +289,28 @@ App.Events.RERelationshipAdvice = class RERelationshipAdvice extends App.Events } else { r.push(`lovingly`); } - r.push(`takes ${slave.slaveName}'s hands in ${hers2}, and then kisses ${him} on the cheek. ${slave.slaveName} crushes ${relSlave.slaveName} in a hug, pressing a squeak out of ${him2}. They're now <span class="relationship">lovers.</span>`); + if (hasAnyArms(relSlave)) { + r.push(`takes ${slave.slaveName}'s hands in ${hers2}, and then`); + } + r.push(`kisses ${him} on the cheek. ${slave.slaveName} crushes ${relSlave.slaveName} in a hug, pressing a squeak out of ${him2}. They're now <span class="relationship">lovers.</span>`); } else if (slave.relationship === 4) { r.push( `- " ${He} stops ${himself}.`, - Spoken(slave, `"No, I want to do this right."`), - `${He} takes ${relSlave.slaveName}'s hand, and then drops to one knee. After a moment of uncomprehending shock, ${relSlave.slaveName} begins to cry.`, + Spoken(slave, `"No, I want to do this right."`) + ); + if (hasAnyArms(relSlave)) { + r.push(`${He} takes ${relSlave.slaveName}'s hand, and then drops to one knee.`); + } else { + r.push(`${He} drops to one knee, holding out ${his} hand to ${relSlave.slaveName}.`); + } + r.push(`After a moment of uncomprehending shock, ${relSlave.slaveName} begins to cry.`, Spoken(slave, `"Will you marry me?"`), - `${relSlave.slaveName} turns to you and`); + `${relSlave.slaveName} turns to you and` + ); if (!canTalk(relSlave)) { r.push(`wordlessly`); } - r.push(`asks if it's all right with you; you nod, and ${he2} turns back to ${slave.slaveName}.`); + r.push(`asks if it's all right with you; you ${canSee(relSlave) ? "nod" : "affirm"}, and ${he2} turns back to ${slave.slaveName}.`); if (!canTalk(relSlave)) { r.push(`${He2} gestures distractedly that ${slave.slaveName} is being silly, and of course ${he2}'ll marry ${him}, because ${he2} loves ${him}.`); } else { diff --git a/src/events/RE/reSlaveMarriage.js b/src/events/RE/reSlaveMarriage.js index 813ac296a3369c73b21dce63e1c3920280a75bff..08c3f73d79dd2b00b4495cf73354f6276ba765db 100644 --- a/src/events/RE/reSlaveMarriage.js +++ b/src/events/RE/reSlaveMarriage.js @@ -3,8 +3,7 @@ App.Events.RESlaveMarriage = class RESlaveMarriage extends App.Events.BaseEvent return[[ (s) => s.fetish !== "mindbroken", hasAnyArms, - hasAnyLegs, - canTalk, + canMove, (s) => s.relationship === 4, (s) => s.devotion > 20, (s) => s.trust > 20, @@ -44,7 +43,7 @@ App.Events.RESlaveMarriage = class RESlaveMarriage extends App.Events.BaseEvent } else { r.push(`doing their best to stay close to one another despite their physical limitations.`); } - r.push(`${brideSlave.slaveName} looks at ${groomSlave.slaveName} expectantly, but ${he2}'s terribly nervous and makes several false starts before beginning. Finally ${groomSlave.slaveName} musters ${his} courage and`); + r.push(`${brideSlave.slaveName} looks at ${groomSlave.slaveName} expectantly, but ${he}'s terribly nervous and makes several false starts before beginning. Finally ${groomSlave.slaveName} musters ${his} courage and`); if (canTalk(groomSlave)) { r.push( `asks with ${his} voice cracking,`, @@ -191,7 +190,8 @@ App.Events.RESlaveMarriage = class RESlaveMarriage extends App.Events.BaseEvent } else if (groomSlave.pregSource === brideSlave.ID) { r.push(`When they tire, ${brideSlave.slaveName} rests ${his2} head upon ${groomSlave.slaveName}'s lap and gently kisses ${his2} lover's belly, knowing the child of their love is growing within.`); } - seX(groomSlave, "oral", brideSlave, "oral"); + SimpleSlaveSlaveFucking(groomSlave, brideSlave, 1); + SimpleSlaveSlaveFucking(brideSlave, groomSlave, 1); groomSlave.devotion += 4; brideSlave.devotion += 4; groomSlave.trust += 4; diff --git a/src/events/RE/reStandardPunishment.js b/src/events/RE/reStandardPunishment.js index e824a302075975ab93fe8ecb6c4f29116f98368f..e52b74396153ac422607722aa30728c9689d88e8 100644 --- a/src/events/RE/reStandardPunishment.js +++ b/src/events/RE/reStandardPunishment.js @@ -5,8 +5,10 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. actorPrerequisites() { return [[ - (s) => s.devotion >= -150, + (s) => s.devotion >= -50, (s) => s.devotion <= 50, + hasAnyArms, + canMove ]]; } @@ -197,7 +199,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`a sad little intake of breath.`); } - r.push(`You're there to let ${him} out after a reasonable time, and ${he} exits the soft little cell <span class="mediumaquamarine">with relief.</span>`); + r.push(`You're there to let ${him} out after a reasonable time, and ${he} exits the soft little cell <span class="trust inc">with relief.</span>`); slave.trust += 4; App.Events.addParagraph(frag, r); return frag; @@ -222,10 +224,12 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. r.push(`${he} begs tearfully`); } else if (slave.voice !== 0) { r.push(`${he} tries frantically to beg`); - } else { + } else if (hasAnyArms(slave)) { r.push(`${he} uses ${his} ${hasBothArms(slave) ? "hands" : "hand"} to supplicate you`); + } else { + r.push(`${he} attempts to beg in any pitiful way ${he} can muster`); } - r.push(`as you close the lid with exquisite slowness. The harshest thing you do is keep silent, not giving ${him} any indication of when ${he}'s getting out. When you finally let ${him} out, ${he}'s <span class="gold">almost crazy with fear</span> of ever going back in the box and, for now, <span class="hotpink">willing to do almost anything</span> to avoid it.`); + r.push(`as you close the lid with exquisite slowness. The harshest thing you do is keep silent, not giving ${him} any indication of when ${he}'s getting out. When you finally let ${him} out, ${he}'s <span class="trust dec">almost crazy with fear</span> of ever going back in the box and, for now, <span class="devotion inc">willing to do almost anything</span> to avoid it.`); slave.devotion += 4; slave.trust -= 4; App.Events.addParagraph(frag, r); @@ -243,13 +247,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`breaks down and makes no move to obey, but does not resist as you take ${his} ${hasBothArms(slave) ? "wrists" : "wrist"} in your hands and lift them into the restraints.`); } - r.push(`The shackles can be moved up or down, and you move them up, raising the shivering, frightened ${desc}`); - if (hasAnyLegs(slave)) { - r.push(`to the tips of ${his} toes.`); - } else { - r.push(`far off the ground.`); - } - r.push(`${He} struggles a little to find ${his} balance, and is distracted when the first stroke lands on ${his} ${slave.skin} buttocks. Your leather instrument is exquisitely designed and balanced to produce pain without breaking the skin or leaving a permanent mark. You tell ${him} to count, and ${he}`); + r.push(`The shackles can be moved up or down, and you move them up, raising the shivering, frightened ${desc} to the tips of ${his} toes. ${He} struggles a little to find ${his} balance, and is distracted when the first stroke lands on ${his} ${slave.skin} buttocks. Your leather instrument is exquisitely designed and balanced to produce pain without breaking the skin or leaving a permanent mark. You tell ${him} to count, and ${he}`); if (canTalk(slave)) { r.push(`gasps "one" through ${his} agony.`); } else if (slave.voice !== 0) { @@ -257,7 +255,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`sticks up one finger despite ${his} restrained ${hasBothArms(slave) ? "hands" : "hand"}.`); } - r.push(`You flog ${his} bottom until it's pleasantly warm to the touch, and then let ${him} down. ${He}'s < span class="mediumaquamarine" > relieved</span > at your moderation.`); + r.push(`You flog ${his} bottom until it's pleasantly warm to the touch, and then let ${him} down. ${He}'s <span class="trust inc">relieved</span> at your moderation.`); slave.trust += 4; App.Events.addParagraph(frag, r); return frag; @@ -272,13 +270,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else if (slave.trust < -20) { r.push(`starts to cry but doesn't let that stop ${him} from hurriedly obeying. ${He} stumbles once, something in your tone that making ${his} knees go weak with terror.`); } else { - r.push(`breaks down and makes no move to obey, but does not resist as you`); - if (hasAnyArms(slave)) { - r.push(`take ${his} ${hasBothArms(slave) ? "wrists" : "wrist"} in your hands`); - } else { - r.push(`grab ${him} around the waist`); - } - r.push(`and hoist ${him} into the restraints.`); + r.push(`breaks down and makes no move to obey, but does not resist as you take ${his} ${hasBothArms(slave) ? "wrists" : "wrist"} in your hands and hoist ${him} into the restraints.`); } r.push(`The shackles can be moved up or down, and you move them down, forcing the weeping slave to spread ${his} legs. You let ${him} anticipate the pain for a long time before you start whipping ${his} buttocks. Your leather instrument is exquisitely designed and balanced to produce pain without breaking the skin or leaving a permanent mark, and you make cruel use of it. After a short preliminary asswhipping, you vary your strokes, letting ${him} feel the whip on ${his} ${hasBothLegs(slave) ? "thighs" : "thigh"}, ${hasBothLegs(slave) ? "calves" : "calf"} and ${hasBothLegs(slave) ? "flanks" : "flank"} before placing strokes against ${his}`); if (slave.scrotum > 0) { @@ -296,7 +288,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`rasping pathetic little sobs past ${his} mute throat.`); } - r.push(`When you're done, ${he}'s <span class="gold">almost crazy with fear</span> of future whippings.`); + r.push(`When you're done, ${he}'s <span class="trust dec">almost crazy with fear</span> of future whippings.`); slave.trust -= 6; App.Events.addParagraph(frag, r); return frag; @@ -319,7 +311,15 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } r.push(`Then you ignore ${him}. Business as usual in your office is profoundly sexual.`); if (slave.energy > 60) { - r.push(`${His} healthy sex drive makes this torture for ${him}; ${he} watches everything that happens in the office with desperate longing. Before long,`); + r.push(`${His} healthy sex drive makes this torture for ${him}; ${he}`); + if (canSee(slave)) { + r.push(`watches`); + } else if (canHear(slave)) { + r.push(`listens to`); + } else { + r.push(`is aware of`); + } + r.push(`everything that happens in the office with desperate longing. Before long,`); } else if (slave.devotion > 20) { r.push(`${He}'s used to the idea of sexual slavery, and inevitably`); if (canSee(slave)) { @@ -374,7 +374,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`though ${he} seems to want to.`); } - r.push(`Satisfied that ${he}'s been tormented enough for today, you let ${him} down and send ${him} on ${his} way. ${He}'s obviously <span class="hotpink">more willing</span> than usual to apply ${himself} to ${his} next sexual task, whatever it is.`); + r.push(`Satisfied that ${he}'s been tormented enough for today, you let ${him} down and send ${him} on ${his} way. ${He}'s obviously <span class="devotion inc">more willing</span> than usual to apply ${himself} to ${his} next sexual task, whatever it is.`); slave.devotion += 4; App.Events.addParagraph(frag, r); @@ -417,7 +417,13 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`panting mutely.`); } - r.push(`When you finally come back and let ${him} down, ${he}'s unsteady on ${his} feet and <span class="hotpink">very submissive,</span> though a bit <span class="libido.dec">burned out</span> on stimulation.`); + r.push(`When you finally come back and let ${him} down, ${he}'s`); + if (canStand(slave)) { + r.push(`unsteady on ${his} feet`); + } else { + r.push(`unable to right ${himself}`); + } + r.push(`and <span class="devotion inc">very submissive,</span> though a bit <span class="libido dec">burned out</span> on stimulation.`); slave.devotion += 6; slave.energy -= 1; App.Events.addParagraph(frag, r); @@ -453,9 +459,8 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`tight hole. ${His} poor little anus doesn't want to let you in, but you force yourself in anyway, making the slave wriggle desperately beneath you as ${he} feels the invading phallus force ${his} anal ring to accommodate its girth.`); } - r.push(`You tell ${him} that many slaves enjoy anal, and that if ${he}'s a good ${desc}, ${he} can too, but that it's against the rules for ${him} to show reluctance to be assfucked. The slave below you is too discomfited by anal pain to respond coherently, but ${he} gets the message. ${He}'ll be <span class="hotpink">better about submitting</span> in the future, but due to the connection between sex and punishment ${he}'ll be <span class="libido.dec">a little less eager for sex,</span> especially anal.`); - slave.counter.anal += 1; - V.analTotal += 1; + r.push(`You tell ${him} that many slaves enjoy anal, and that if ${he}'s a good ${desc}, ${he} can too, but that it's against the rules for ${him} to show reluctance to be assfucked. The slave below you is too discomfited by anal pain to respond coherently, but ${he} gets the message. ${He}'ll be <span class="devotion inc">better about submitting</span> in the future, but due to the connection between sex and punishment ${he}'ll be <span class="libido dec">a little less eager for sex,</span> especially anal.`); + r.push(VCheck.Anal(slave, 1)); slave.devotion += 4; slave.energy -= 2; App.Events.addParagraph(frag, r); @@ -485,10 +490,8 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`poor tight pussy. ${He}'s tight, and the initial penetration was uncomfortable for ${him}, but you make it worse by treating ${his} cunt like a veteran whore's. ${He} begins to struggle a little as you hammer ${him}.`); } - r.push(`You tell ${him} that many slaves enjoy getting fucked, and that if ${he}'s a good ${desc}, ${he} can too, but that it's against the rules for ${him} to show reluctance to be penetrated. The slave below you is too discomfited to respond coherently, but ${he} gets the message. ${He}'ll be <span class="hotpink">better about submitting</span> in the future, but due to the connection between sex and punishment ${he}'ll be <span class="libido.dec">a little less eager for sex,</span> especially vaginal.`); - slave.counter.vaginal += 1; - addPartner(slave, -1); - V.vaginalTotal += 1; + r.push(`You tell ${him} that many slaves enjoy getting fucked, and that if ${he}'s a good ${desc}, ${he} can too, but that it's against the rules for ${him} to show reluctance to be penetrated. The slave below you is too discomfited to respond coherently, but ${he} gets the message. ${He}'ll be <span class="devotion inc">better about submitting</span> in the future, but due to the connection between sex and punishment ${he}'ll be <span class="libido dec">a little less eager for sex,</span> especially vaginal.`); + r.push(VCheck.Vaginal(slave, 1)); slave.devotion += 4; slave.energy -= 2; App.Events.addParagraph(frag, r); @@ -513,8 +516,8 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. r.push(`You shove it down ${his}`); if (slave.sexualQuirk === "gagfuck queen") { r.push(`spectacularly unresisting throat. The gagfuck queen has no gag reflex to speak of, but even ${he} has ${his} limit. You rape ${his} face without mercy, deliberately ruining ${his} practiced ability to breathe while giving a cock deep oral.`); - } else if ((slave.fetish === "cumslut") && (slave.fetishKnown === 1)) { - r.push(`eager throat. The cumslut loves giving oral, but soon realizes that you have no intention of letting ${him} love this. You rape ${his} face without mercy, hilting ${his} lips against`); + } else if (slave.fetish === "cumslut") { + r.push(`eager throat. The ${slave.fetishKnown === 1 ? "cumslut" : "bitch"} loves giving oral, but soon realizes that you have no intention of letting ${him} love this. You rape ${his} face without mercy, hilting ${his} lips against`); if (V.PC.dick !== 0) { r.push(`your base.`); } else { @@ -529,9 +532,8 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`Even as ${he} pants, ${he} uses shaky gestures to beg forgiveness, and ${he} even`); } - r.push(`promises to be less chatty. ${He}'ll be <span class="hotpink">more punctual</span> in the future, but due to the connection between sex and punishment ${he}'ll be <span class="libido.dec">a little less eager for sex,</span> especially oral.`); - slave.counter.oral += 1; - V.oralTotal += 1; + r.push(`promises to be less chatty. ${He}'ll be <span class="devotion inc">more punctual</span> in the future, but due to the connection between sex and punishment ${he}'ll be <span class="libido dec">a little less eager for sex,</span> especially oral.`); + seX(slave, "oral", V.PC, "penetrative", 1); slave.devotion += 4; slave.energy -= 2; App.Events.addParagraph(frag, r); @@ -541,7 +543,13 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. function run() { const frag = new DocumentFragment(); let r = []; - r.push(`You tell ${him} that ${he} clearly needs practice being prompt. Your tone is conversational, but ${he} doesn't mistake it for kindness. It's the tone you use with slaves when imparting guidance which is to be accepted and followed on pain of terrible punishment. You make ${him} explain where ${he} was and what ${he} was doing previously, and require ${him} to walk you there. ${He} does,`); + r.push(`You tell ${him} that ${he} clearly needs practice being prompt. Your`); + if (canHear(slave)) { + r.push(`Your tone is conversational, but ${he} doesn't mistake it for kindness. It's the tone you use with`); + } else { + r.push(`Your gestures are soft, but ${he} doesn't mistake that for kindness. It's what you use with deaf`); + } + r.push(`slaves when imparting guidance which is to be accepted and followed on pain of terrible punishment. You make ${him} explain where ${he} was and what ${he} was doing previously, and require ${him} to walk you there. ${He} does,`); if (slave.trust > 20) { r.push(`trustingly`); } else if (slave.trust >= -20) { @@ -556,7 +564,9 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. r.push(`shriek`); } r.push(`at ${him} to run! ${He} takes off,`); - if (shoeHeelCategory(slave) === 3) { + if (!canWalk(slave)) { + r.push(`crawling as fast as ${his} body will let ${him}. Sure ${he} isn't running, since ${he} can't, but ${he} is struggling along at an impressive pace.`); + } else if (shoeHeelCategory(slave) === 3) { r.push(`tottering agonizingly along in ${his} extreme heels. ${He} isn't running, not really, but ${his} slutty shoes are so ridiculous that ${he} can't. ${He}'s going as fast as ${he} possibly can.`); } else if (shoeHeelCategory(slave) > 1) { r.push(`running awkwardly in ${his} ${slave.shoes}.`); @@ -587,17 +597,17 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`belly`); } - r.push(`impedes ${him} terribly, but ${he} tries to waddle along as best ${he} can.`); + r.push(`impedes ${him} terribly, but ${he} tries to ${canWalk(slave) ? "waddle" : "push"} along as best ${he} can.`); } else if (slave.boobsImplant > 600) { - r.push(`${his} implants bounce around painfully, so ${he} cradles ${his} fake tits in ${his} arms, trying to support them as much as possible.`); + r.push(`${his} implants bounce around painfully, so ${he} cradles ${his} fake tits in ${his} arm${hasBothArms(slave) ? "s" : ""}, trying to support them as much as possible.`); } else if (slave.boobs > 2000) { - r.push(`${his} huge tits bounce around painfully, so ${he} cradles ${his} udders in ${his} arms, trying to support them as much as possible.`); + r.push(`${his} huge tits bounce around painfully, so ${he} cradles ${his} udders in ${his} arm${hasBothArms(slave) ? "s" : ""}, trying to support them as much as possible.`); } else if (slave.butt > 2) { r.push(`${his} big buttocks impede ${him} a bit, but ${he} does ${his} best, making them work around delightfully.`); } else { r.push(`${his} cute rear makes a pretty picture.`); } - r.push(`You make ${him} repeat the exercise until ${he}'s quite tired, hounding ${him} mercilessly, and then send ${him} off to rinse away the sweat ${he} worked up before getting back to work. ${He}'ll be <span class="hotpink">more punctual</span> in the future.`); + r.push(`You make ${him} repeat the exercise until ${he}'s quite tired, hounding ${him} mercilessly, and then send ${him} off to rinse away the sweat ${he} worked up before getting back to work. ${He}'ll be <span class="devotion inc">more punctual</span> in the future.`); slave.devotion += 4; App.Events.addParagraph(frag, r); return frag; @@ -607,8 +617,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. const frag = new DocumentFragment(); let r = []; r.push(`Deciding to ensure the ${desc} really understands that ${he}'s a sex slave and can be used by anyone, even other slaves, you order ${him} to put ${his} mouth to work on the slave who demanded sex from ${him}.`); - slave.counter.oral += 1; - V.oralTotal += 2; + actX(slave, "oral"); if (slave.devotion > 20) { r.push(`${He} hurries to comply, knowing ${he}'s in trouble and not wanting to make it any worse.`); } else if (slave.trust < -20) { @@ -633,8 +642,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. r.push(`tight little`); } r.push(`pussy vulnerable. You fuck ${him} hard, making it a punishment.`); - slave.counter.vaginal += 1; - V.vaginalTotal += 1; + r.push(VCheck.Vaginal(slave, 1)); } else if (canDoAnal(slave) && (slave.anus !== 0)) { r.push(`paw ${his} butt, using a couple of fingers to tease ${his}`); if (slave.anus > 2) { @@ -645,8 +653,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. r.push(`tight little`); } r.push(`asshole before penetration. You fuck ${him} hard, making it a punishment.`); - slave.counter.anal += 1; - V.analTotal += 1; + r.push(VCheck.Anal(slave, 1)); } else { r.push(`push ${his}`); if (hasBothLegs(slave)) { @@ -657,8 +664,10 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. r.push(`together, settling for some`); if (V.PC.dick !== 0) { r.push(`frottage`); + seX(slave, "anal", V.PC, "penetrative", 1); } else { r.push(`tribbing`); + seX(slave, "anal", V.PC, "vaginal", 1); } r.push(`to preserve ${his}`); if (slave.vagina === -1) { @@ -667,10 +676,8 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. r.push(`virginities.`); } r.push(`Since you're not fucking ${him}, you spank ${his} ass mercilessly to make it an effective punishment.`); - slave.counter.oral += 1; - V.oralTotal += 1; } - r.push(`The horny slave getting oral enjoys the oral attention, especially once ${slave.slaveName} starts to groan with discomfort. You discard ${him} once everyone except ${him} has gotten off. ${He}'ll be <span class="hotpink">more submissive</span> to sexual demands from now on, though ${he}'ll be <span class="libido.dec">slightly less interested in sex</span> for ${his} own pleasure.`); + r.push(`The horny slave getting oral enjoys the oral attention, especially once ${slave.slaveName} starts to groan with discomfort. You discard ${him} once everyone except ${him} has gotten off. ${He}'ll be <span class="devotion inc">more submissive</span> to sexual demands from now on, though ${he}'ll be <span class="libido dec">slightly less interested in sex</span> for ${his} own pleasure.`); slave.devotion += 4; slave.energy -= 2; App.Events.addParagraph(frag, r); @@ -694,8 +701,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`grind your pussy against ${him}, fucking ${him} hard despite the lack of penetration.`); } - slave.counter.vaginal += 1; - V.vaginalTotal += 1; + r.push(VCheck.Vaginal(slave, 1)); } else if (canDoAnal(slave) && (slave.anus !== 0)) { r.push(`shove ${his} face against the nearest wall, using a bit of warning pressure of your fingers against ${his} throat to warn ${him} to take ${his} punishment. Then you`); if (V.PC.dick !== 0) { @@ -703,19 +709,18 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`use one hand to fuck ${his} ass and the other to look after yourself.`); } - slave.counter.anal += 1; - V.analTotal += 1; + r.push(VCheck.Anal(slave, 1)); } else { r.push(`pull ${him} to ${his} ${hasBothLegs(slave) ? "knees" : "knee"},`); if (V.PC.dick !== 0) { r.push(`shoving your dick down ${his} throat.`); + seX(slave, "oral", V.PC, "penetrative", 1); } else { r.push(`straddling ${his} face and grinding yourself against ${his} mouth.`); + seX(slave, "oral", V.PC, "vaginal", 1); } - slave.counter.oral += 1; - V.oralTotal += 1; } - r.push(`The slut needs it so badly that ${he} almost climaxes, but you ruin ${his} building orgasms whenever you detect them. When you've gotten yours, you drop ${him} and walk off, leaving ${him} feeling comprehensively fucked, but no less horny. ${He}'ll be <span class="hotpink">very willing</span> to do anything that will earn ${his} release.`); + r.push(`The slut needs it so badly that ${he} almost climaxes, but you ruin ${his} building orgasms whenever you detect them. When you've gotten yours, you drop ${him} and walk off, leaving ${him} feeling comprehensively fucked, but no less horny. ${He}'ll be <span class="devotion inc">very willing</span> to do anything that will earn ${his} release.`); slave.devotion += 4; App.Events.addParagraph(frag, r); return frag; diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js index 092f0c6dd3f32a72bbad16c9c3e1e43e3037d0f8..a594cbf6e05948dad0131d920ced025b4daabe70 100644 --- a/src/js/statsChecker/statsChecker.js +++ b/src/js/statsChecker/statsChecker.js @@ -696,6 +696,10 @@ globalThis.canPenetrate = function(slave) { return false; } else if (slave.dick > 7) { return false; + /* + } else if (slave.belly >= 300000) { + return false; + */ } return true; }; diff --git a/src/js/utilsAssessSlave.js b/src/js/utilsAssessSlave.js index 49d7452709fdd22f46950c2376c6630212beb241..4e2c6dc5dc382742b8e808893801c51ffb8b8c2c 100644 --- a/src/js/utilsAssessSlave.js +++ b/src/js/utilsAssessSlave.js @@ -220,6 +220,8 @@ globalThis.isShelterSlave = function(slave) { * @returns {number} */ globalThis.perceivedGender = function(slave) { + // primary checks are face, hormones, hips, shoulders and shoulder/hip ratio + // consider androgynous + flat + muscles to be masculine and androgynous + preg to be feminine return -1; }; diff --git a/src/js/utilsPC.js b/src/js/utilsPC.js index 857ed5e7929db204eed008a896b27243753512d4..0e25f1fc9bdcfab10ed6b9e811172a3dcf214227 100644 --- a/src/js/utilsPC.js +++ b/src/js/utilsPC.js @@ -631,7 +631,9 @@ globalThis.onBedRest = function(actor) { return true; } else if (!canMove(actor)) { return true; - } else if (actor.preg > actor.pregData.normalBirth / 1.33 && actor.womb.find((ft) => ft.genetics.geneticQuirks.polyhydramnios === 2 && ft.age >= 20)) { + } else if (actor.preg > actor.pregData.normalBirth / 1.05) { // consider birth delayers and how they play into this + return true; + } else if (actor.womb.find((ft) => ft.genetics.geneticQuirks.polyhydramnios === 2 && ft.age >= 20)) { return true; } else if (actor.bellyPreg >= actor.pregAdaptation * 2200) { return true;