diff --git a/src/arcologyBuilding/shops.js b/src/arcologyBuilding/shops.js index 5f14f7eefd0b1411ea0d20f7d4e0c3a8a08f5cb1..d5ab18b5d190ce9d7328eb117fc1709b686668a4 100644 --- a/src/arcologyBuilding/shops.js +++ b/src/arcologyBuilding/shops.js @@ -311,6 +311,7 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Convert this sector of the promenade into a brothel.", () => { + this._clearFsStyle(); V.brothel = 5; this.type = "Brothel"; }, cost, "and will incur upkeep costs" @@ -321,23 +322,20 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Build a club to serve as a focal point for public sluts.", () => { + this._clearFsStyle(); V.club = 5; this.type = "Club"; }, cost, "and will incur upkeep costs" )); } - // if (this.type !== "Shops") { - const currentFSStyle = this.type.replace(/\s+/g, ''); - // <</if>> - if (A.FSSubjugationist !== "unset") { if (V.FSPromenade.Subjugationist === 0) { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Subjugationist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.Subjugationist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Subjugationist"; }, cost )); @@ -349,8 +347,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Supremacist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.Supremacist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Supremacist"; }, cost )); @@ -362,8 +360,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Gender Radicalist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.GenderRadicalist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Gender Radicalist"; }, cost )); @@ -373,8 +371,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Gender Fundamentalist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.GenderFundamentalist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Gender Fundamentalist"; }, cost )); @@ -386,8 +384,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Paternalist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.Paternalist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Paternalist"; }, cost )); @@ -397,8 +395,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Degradationist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.Degradationist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Degradationist"; }, cost )); @@ -410,8 +408,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Intellectual Dependency establishments.", () => { + this._clearFsStyle(); V.FSPromenade.IntellectualDependency = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Intellectual Dependency"; }, cost )); @@ -421,8 +419,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Slave Professionalism establishments.", () => { + this._clearFsStyle(); V.FSPromenade.SlaveProfessionalism = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Slave Professionalism"; }, cost )); @@ -434,8 +432,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Body Purist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.BodyPurist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Body Purist"; }, cost )); @@ -445,8 +443,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Transformation Fetishist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.TransformationFetishist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Transformation Fetishist"; }, cost )); @@ -458,8 +456,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Youth Preferentialist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.YouthPreferentialist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Youth Preferentialist"; }, cost )); @@ -469,8 +467,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Maturity Preferentialist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.MaturityPreferentialist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Maturity Preferentialist"; }, cost )); @@ -482,8 +480,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Petite Admiration establishments.", () => { + this._clearFsStyle(); V.FSPromenade.PetiteAdmiration = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Petite Admiration"; }, cost )); @@ -493,8 +491,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Statuesque Glorification establishments.", () => { + this._clearFsStyle(); V.FSPromenade.StatuesqueGlorification = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Statuesque Glorification"; }, cost )); @@ -506,8 +504,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Slimness Enthusiast establishments.", () => { + this._clearFsStyle(); V.FSPromenade.SlimnessEnthusiast = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Slimness Enthusiast"; }, cost )); @@ -517,8 +515,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Asset Expansionist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.AssetExpansionist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Asset Expansionist"; }, cost )); @@ -529,9 +527,9 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { if (V.FSPromenade.Pastoralist === 0) { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Pastoralist establishments.", - () => { - V.FSPromenade.Pastoralist = 1; - V.FSPromenade[currentFSStyle] = 0; + () => {; + this._clearFsStyle(); + V.FSPromenade.Pastoralist = 1 this.type = "Pastoralist"; }, cost )); @@ -543,8 +541,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Physical Idealist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.PhysicalIdealist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Physical Idealist"; }, cost )); @@ -554,8 +552,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Hedonistic establishments.", () => { + this._clearFsStyle(); V.FSPromenade.Hedonism = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Hedonism"; }, cost )); @@ -567,8 +565,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Repopulationist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.Repopulationist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Repopulationist"; }, cost )); @@ -578,8 +576,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Eugenics establishments.", () => { + this._clearFsStyle(); V.FSPromenade.Eugenics = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Eugenics"; }, cost )); @@ -591,8 +589,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Chattel Religionist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.ChattelReligionist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Chattel Religionist"; }, cost )); @@ -604,8 +602,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Roman Revivalist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.RomanRevivalist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Roman Revivalist"; }, cost )); @@ -615,8 +613,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Aztec Revivalist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.AztecRevivalist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Aztec Revivalist"; }, cost )); @@ -626,8 +624,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Egyptian Revivalist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.EgyptianRevivalist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Egyptian Revivalist"; }, cost )); @@ -637,8 +635,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Edo Revivalist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.EdoRevivalist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Edo Revivalist"; }, cost )); @@ -648,8 +646,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Arabian Revivalist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.ArabianRevivalist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Arabian Revivalist"; }, cost )); @@ -659,8 +657,8 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Upgrade this sector to appeal to Chinese Revivalist establishments.", () => { + this._clearFsStyle(); V.FSPromenade.ChineseRevivalist = 1; - V.FSPromenade[currentFSStyle] = 0; this.type = "Chinese Revivalist"; }, cost )); @@ -671,7 +669,7 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { fragment.append(this._makeUpgrade( "Return this sector to standard outlets", () => { - V.FSPromenade[currentFSStyle] = 0; + this._clearFsStyle(); this.type = "Shops"; }, cost )); @@ -680,6 +678,13 @@ App.Arcology.Cell.Shop = class extends App.Arcology.Cell.BaseCell { return fragment; } + _clearFsStyle() { + if (!["Shops", "Brothel", "Club"].includes(this.type)) { + const currentFSStyle = this.type.replace(/\s+/g, ''); + V.FSPromenade[currentFSStyle] = 0; + } + } + /** * @returns {boolean} */ diff --git a/src/events/RESS/devotedEducated.js b/src/events/RESS/devotedEducated.js new file mode 100644 index 0000000000000000000000000000000000000000..d11d2aaa111491b90bb7767dd45b436baa6b4dfd --- /dev/null +++ b/src/events/RESS/devotedEducated.js @@ -0,0 +1,150 @@ +App.Events.RESSDevotedEducated = class RESSDevotedEducated extends App.Events.BaseEvent { + eventPrerequisites() { + return []; + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + hasAnyLegs, + canTalk, + s => s.devotion > 50, + s => s.intelligence + s.intelligenceImplant > 50, + s => s.intelligenceImplant >= 15, + s => s.accent < 4 + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, himself + } = getPronouns(eventSlave); + const {say, title: Master} = getEnunciation(eventSlave); + const desc = SlaveTitle(eventSlave); + + /** @type {App.Entity.PlayerState} */ + let PC = V.PC; + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + let t = []; + + t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave)); + t.push(`comes before you for a routine inspection. The ${desc} is a well-educated and obedient slave. Though ${he} performs ${his} duties devotedly and to the best of ${his} abilities, slave life is not particularly conducive to straining an individual's brainpower. You happen to run into ${eventSlave.slaveName} in the hallways of the penthouse, where ${he} takes the opportunity to wordlessly signal ${he} wishes to gain your attention.`); + if (canTalk(eventSlave)) { + t.push(`"${Master}," ${he} ${say}s. "${Spoken(eventSlave, `I really enjoy my role as your slave, but I just don't feel like my new life stimulates me.`)}" ${He} blushes prettily at ${his} choice of words before continuing, "${Spoken(eventSlave, `Stimulate my mind, I mean.`)}"`); + } else { + t.push(`${He} uses gestures to beg your pardon and explains that while ${he} enjoys life as your slave, ${he} doesn't feel like ${his} new role in your arcology allows ${him} to stimulate ${his} mind as often as it does ${his} body.`); + } + App.Events.addParagraph(node, t); + t = []; + + App.Events.addResponses(node, [ + new App.Events.Result(`Have a conversation with ${him}`, conversation), + canDoAnal(eventSlave) || canDoVaginal(eventSlave) + ? new App.Events.Result(`Stimulate ${his} mind and body`, stimulate, virginityCheck()) + : new App.Events.Result(), + V.arcologies[0].FSDegradationist !== "unset" + ? new App.Events.Result(`A public blowbang will show ${him} what a Degradationist arcology thinks about 'educated' slaves`, blowbang) + : new App.Events.Result(), + V.arcologies[0].FSPaternalist !== "unset" + ? new App.Events.Result(`Allow ${him} to audit some advanced classes at Paternalist slave schools`, schooling) + : new App.Events.Result() + ]); + + function conversation() { + t = []; + + t.push(`You linger in the hallway a while with ${eventSlave.slaveName} and enjoy a brief but verbose discussion. It's clear ${he} hasn't had the chance to engage in any meaningful conversations in a while, so ${he} relishes the opportunity energetically.`); + App.Events.addParagraph(node, t); + t = []; + + t.push(`Though the two of you only touch upon a handful of sophisticated topics, by the time you leave ${him} to tend to other matters, ${eventSlave.slaveName} is beaming happily as ${he} continues on to ${his} duties for the day. ${He} <span class="mediumaquamarine">trusts you more</span> for taking the time to engage with ${him} intellectually.`); + App.Events.addParagraph(node, t); + t = []; + + eventSlave.trust += 4; + return t; + } + + function stimulate() { + t = []; + + t.push(`You find a comfortable seat to sit on ${PC.dick === 0 ? "and don a strap-on" : ""} as ${he} seats ${his}`); + if (eventSlave.butt < 2) { + t.push(`narrow`); + } else if (eventSlave.butt < 5) { + t.push(`average`); + } else if (eventSlave.butt < 8) { + t.push(`plump`); + } else if (eventSlave.butt < 12) { + t.push(`impressive`); + } else { + t.push(`mind-blowing`); + } + t.push(`ass on your ${PC.dick === 0 ? "strap-on" : "dick"} and rides you. While your cock plumbs the depths of ${his} ${canDoVaginal(eventSlave) ? "pussy" : "butt"}, the two of you engage in a casual debate over a number of topics of sophistry.`); + App.Events.addParagraph(node, t); + t = []; + + t.push(`At the crux of one of ${his} concluding arguments, the intense pleasure from the prolonged ${canDoVaginal(eventSlave) ? "fucking" : "buttfucking"} pushes ${him} over the edge into orgasm, robbing the thrust of ${his} defense of any gravitas it once had. ${He} doesn't seem to mind however, choosing to instead wrap up ${his} remarks by <span class="hotpink">blowing you a kiss.</span>`); + if (canDoVaginal(eventSlave)) { + t.push(VCheck.Vaginal(1, eventSlave)); + } else { + t.push(VCheck.Anal(1, eventSlave)); + } + App.Events.addParagraph(node, t); + t = []; + + eventSlave.devotion += 4; + return t; + } + + function blowbang() { + t = []; + + t.push(`You tell ${him} ${he}'ll get fucked in the mouth until ${he} either gets over the idea of being special for ${his} education or until all ${his} learning is fucked out of ${his} head. You drag the protesting ${eventSlave.slaveName} out into a public plaza, restrain ${him} in stocks so that ${his} mouth is available, and inform the gathering crowd of citizens that this particular slave thinks ${himself} more than a fuckhole because of some fancy 'education'.`); + App.Events.addParagraph(node, t); + t = []; + + t.push(`When you return later in the evening, it becomes abundantly clear that your citizenry taught ${eventSlave.slaveName} a harsh lesson about a slave's place in ${V.arcologies[0].name}. ${eventSlave.slaveName} has certainly <span class="green">learned to keep any pretentious thoughts about ${his} education in ${his} head.</span> ${He} did, however, <span class="red">have quite a rough time</span> sucking all those dicks${eventSlave.skill.oral <= 30 ? `, though ${he} did learn about sucking dick, so ${he} can't claim enslavement isn't educational. ${SkillIncrease.Oral(eventSlave, 10)}` : "."} And last of all, you and ${eventSlave.slaveName} did make <span class="green">quite a good impression</span> today, though for widely differing reasons.`); + App.Events.addParagraph(node, t); + t = []; + + seX(eventSlave, "oral", "public", "penetrative", jsRandom(65,80)); + repX(500, "event", eventSlave); + healthDamage(eventSlave, 10); + return t; + } + + function schooling() { + t = []; + + t.push(`You tell ${him} to take the day off for a trip to audit classes at ${V.arcologies[0].name}'s most renowned Paternalist slave schools. ${eventSlave.slaveName} is shocked into a reverie by your words before running to wrap ${his} arms around you in a tight hug. When ${he} eventually untangles ${himself} from you, ${he} races off to get ready for ${his} day of intellectualism while you direct ${V.assistant.name} to make the necessary arrangements.`); + App.Events.addParagraph(node, t); + t = []; + + t.push(`When ${eventSlave.slaveName} returns, ${he} looks exhausted but happier than you've ever seen ${him}. It seems ${he} benefited greatly from ${V.arcologies[0].name}'s Paternalist institutions, and has grown to <span class="mediumaquamarine">trust you more</span> while also <span class="hotpink">deepening ${his} acceptance of slavery.</span>`); + App.Events.addParagraph(node, t); + t = []; + + eventSlave.trust += 4; + eventSlave.devotion += 4; + return t; + } + + function virginityCheck() { + if (canDoVaginal(eventSlave) && eventSlave.vagina === 0) { + return `This option will take ${his} virginity`; + } else if (canDoAnal(eventSlave) && eventSlave.anus === 0) { + return `This option will take ${his} anal virginity`; + } + } + } +}; diff --git a/src/events/RESS/kitchenMolestation.js b/src/events/RESS/kitchenMolestation.js new file mode 100644 index 0000000000000000000000000000000000000000..d6a6ee936ca7652f6ad6a95b6b51f1b74338f449 --- /dev/null +++ b/src/events/RESS/kitchenMolestation.js @@ -0,0 +1,215 @@ +App.Events.RESSKitchenMolestation = class RESSKitchenMolestation extends App.Events.BaseEvent { + eventPrerequisites() { + return [ + () => V.cockFeeder > 0, + () => V.universalRulesConsent === 0 + ]; + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + hasAnyLegs, + canTalk, + s => s.devotion > 50, + s => s.fetish === "sadist" || s.fetish === "dom" || s.energy > 95, + s => canPenetrate(s) || s.dick === 0 + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, His, his, him, himself + } = getPronouns(eventSlave); + const { + HeU, heU, hisU, himU, himselfU + } = getNonlocalPronouns(V.seeDicks).appendSuffix('U'); + const belly = bellyAdjective(eventSlave); + const targetJobs = ["be a servant", "be a subordinate slave", "get milked", "learn in the schoolroom", "please you", "rest in the spa", "rest", "serve in the club", "serve the public", "take classes", "whore", "work a glory hole", "work as a servant", "work in the brothel"]; + + /** @type {App.Entity.PlayerState} */ + let PC = V.PC; + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + let t = []; + + t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave)); + t.push(`is a horny bitch, and ${he} isn't particularly picky about how ${he} gets off. Since other slaves are not allowed to resist ${his} little molestations, ${he}'s taken to haunting the kitchen around mealtimes. Since everyone has to suck their meals out of the phallic food dispensers, every slave has to spend some minutes of every day in the kitchen with their face to the wall and their rear defenseless. ${eventSlave.slaveName} does ${his} best to arrive as early as possible and eat as rapidly as possible so ${he} can then play with anyone who's slower to finish.`); + App.Events.addParagraph(node, t); + t = []; + + t.push(`You decide to stop by to see ${his} method at work. By the time you arrive, ${he}'s already eaten and orgasmed at least once. As you spectate, ${he}`); + if (canPenetrate(eventSlave) && eventSlave.prostate > 0) { + t.push(`pushes a couple of fingers up ${his} own ass to use prostate stimulation to force ${himself} hard again, and once this is accomplished, happily turns to select a slow eater to fuck.`); + } else { + t.push(`languidly plays with ${himself}, running ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} over the various vulnerable butts before picking a victim to roughly finger fuck.`); + } + App.Events.addParagraph(node, t); + t = []; + + App.Events.addResponses(node, [ + new App.Events.Result(`Improve on ${his} abusive little game`, improve), + canDoAnal(eventSlave) + ? new App.Events.Result("The rule about consent works both ways", turnTables, analVirginWarning()) + : new App.Events.Result() + ]); + + function improve() { + t = []; + let virgins, chaste, anusOnly, doubleAnal, pussyOnly, doubleVaginal, subLove; + + t.push(`You leave for the moment, but appear at the next mealtime before even ${he} does. You shut off all the phallic feeders but one, and make an announcement. You decree that just for this one meal, ${eventSlave.slaveName} is to lie in front of the one functional feeder, ${canPenetrate(eventSlave) ? `${his} cock in the air` : `with a dildo jutting up from ${his} crotch`} in order to eat, each slave must ride ${eventSlave.slaveName} for as long as it takes to suck down their ${eventSlave.belly >= 5000 ? `meal (given the ${belly} mass jutting from ${his} middle, it should be quite the sight)` : "meal"}.`); + t.push(`${eventSlave.slaveName} gapes at you openmouthed for a long moment, looking like ${he} wants to <span class="hotpink">declaim a speech of thanks,</span> but you cut ${him} off by pointing peremptorily at ${his} place; ${he} almost runs over, ${his} <span class="mediumaquamarine">trust in your whim</span> nearly absolute. But the true shape of your plan isn't apparent yet. When the first slave seats ${himselfU} on ${eventSlave.slaveName} and starts sucking off the dispenser dildo, you crouch behind ${himU} and insert yourself as well; the bitch is now airtight. ${HeU} gags and splutters with the discomfort but keeps working away until ${heU} gets ${hisU} meal down and struggles off the three phalluses ${heU} has in ${himU}. The next in line gets to it with some trepidation: and so it goes, slave by slave.`); + + V.slaves.forEach(function(s) { + if (targetJobs.includes(s.assignment) && hasAnyLegs(s) && s.relationship !== -3 && s.ID !== eventSlave.ID) { + if (canDoAnal(s) && canDoVaginal(s)) { + if (s.anus === 0 && s.vagina === 0) { + virgins = true; + } else if (s.vagina === 0) { + virgins = true; + anusOnly = true; + seX(s, "anal", eventSlave, "penetrative"); + seX(s, "anal", PC, "penetrative"); + if (canImpreg(s, PC)) { + t.push(knockMeUp(s, 5, 1, -1, 1)); + } + if (canImpreg(s)) { + t.push(knockMeUp(s, 5, 1, eventSlave.ID, 1)); + } + if (s.anus === 1) { + s.trust -= 2; + doubleAnal = true; + } + } else if (s.anus === 0) { + virgins = true; + pussyOnly = true; + seX(s, "vaginal", eventSlave, "penetrative"); + seX(s, "vaginal", PC, "penetrative"); + if (canImpreg(s, PC)) { + t.push(knockMeUp(s, 5, 0, -1, 1)); + } + if (canImpreg(s)) { + t.push(knockMeUp(s, 5, 0, eventSlave.ID, 1)); + } + if (s.vagina === 1) { + s.trust -= 2; + doubleVaginal = true; + } + } else { + seX(s, "anal", eventSlave, "penetrative"); + seX(s, "vaginal", eventSlave, "penetrative"); + if (canImpreg(s, PC)) { + t.push(knockMeUp(s, 5, 2, -1, 1)); + } + if (canImpreg(s)) { + t.push(knockMeUp(s, 5, 1, eventSlave.ID, 1)); + } + } + } else if (canDoVaginal(s)) { + pussyOnly = true; + seX(s, "vaginal", eventSlave, "penetrative"); + seX(s, "vaginal", PC, "penetrative"); + if (canImpreg(s, PC)) { + t.push(knockMeUp(s, 5, 0, -1, 1)); + } + if (canImpreg(s)) { + t.push(knockMeUp(s, 5, 0, eventSlave.ID, 1)); + } + if (s.vagina === 1) { + s.trust -= 2; + doubleVaginal = true; + } + } else if (canDoAnal(s)) { + anusOnly = true; + seX(s, "anal", eventSlave, "penetrative"); + seX(s, "anal", PC, "penetrative"); + if (canImpreg(s, PC)) { + t.push(knockMeUp(s, 5, 1, -1, 1)); + } + if (canImpreg(s)) { + t.push(knockMeUp(s, 5, 1, eventSlave.ID, 1)); + } + if (s.anus === 1) { + s.trust -= 2; + doubleAnal = true; + } + } else { + chaste = true; + } + if (s.fetishKnown === 1 && s.fetish === "submissive") { + s.devotion++; + subLove = true; + } + } + }); + if (virgins) { + t.push(`You let your virgins ${chaste ? "and chaste slaves" : ""} hold their thighs tight together for a little frottage rather than deflowering their holes like this.`); + } else if (chaste) { + t.push(`Your chaste slaves hold their thighs tight together for a little frottage should they lack the ability to accommodate.`); + } + if (anusOnly) { + t.push(`Those slaves without pussies are forced to take both you and ${eventSlave.slaveName} up the butt at once.`); + if (doubleAnal) { + t.push(`Experienced assholes can take the strain just fine, but your tighter-assed slaves are <span class="gold">frightened</span> by the anal pain they suffer.`); + } + } + if (pussyOnly) { + t.push(`Slaves with off-limit assholes quickly find both you and ${eventSlave.slaveName} delving the depths of their cunts.`); + if (doubleVaginal) { + t.push(`Experienced sluts can take the double penetration just fine, but your tighter slaves are <span class="gold">frightened</span> by the amount of stretching they are forced to undergo.`); + } + } + if (subLove) { + t.push(`Your subs on the other hand think this is <span class="hotpink">a meal worth remembering.</span>`); + } + + eventSlave.devotion += 4; + eventSlave.trust += 4; + return t; + } + + function turnTables() { + t = []; + + t.push(`You tell ${eventSlave.slaveName} to get up on the kitchen counter and spread ${his} legs. ${He} catches something in the tone of your voice and looks frightened, but obeys. You then make several conversational observations, as though for no particular reason, to the rest of the slaves. First, you point out, the consent rule works for everyone: they, hypothetically, would not need to ask ${eventSlave.slaveName} ${his} permission to fuck ${his} ass, just like ${he} doesn't have to ask their permission to molest them during meals. (At this ${eventSlave.slaveName}'s fear deepens into obvious <span class="gold">terror.</span>) Second, you have decided ${eventSlave.slaveName} will not be getting down off the counter until everyone's done with their meals — and anything else they wish to do in the kitchen. And third, you conclude, any number of large strap-ons and dildos can be found in the kitchen cabinets. There is a general rush for these; you tell ${eventSlave.slaveName}, whose`); + if (eventSlave.lips > 40) { + t.push(`bimbo`); + } else if (eventSlave.lips > 20) { + t.push(`big`); + } else if (eventSlave.lips > 10) { + t.push(`soft`); + } + t.push(`lips are quivering, to come see you after ${he}'s done here. About an hour later, ${he} hobbles into your office, and you tell ${him} to show you ${his} anus. ${His} longtime targets for mealtime molestation were not merciful; they weren't stupid enough to damage ${him}, but that's one well-gaped butthole. You fuck it anyway, and ${he}'s too tired and desensitized to care. Your less trusting slaves carefully consider the rules, and realize that there's a <span class="mediumaquamarine">built-in mechanism for correction:</span> if anyone gets too rapey, they can rape them right back.`); + t.push(VCheck.Anal(20, eventSlave)); + + if (canGetPregnant(eventSlave) && eventSlave.mpreg === 1) { + const pregSources = V.slaves.map(s => canImpreg(eventSlave, s) && targetJobs.includes(s.assignment) && s.ID != eventSlave.ID); + if (pregSources.length > 0) { + t.push(knockMeUp(eventSlave, 50, 1, pregSources.pluck(), 1)); + } + } + V.slaves.forEach(function(s) { if (s.trust < 50 && targetJobs.includes(s.assignment) && s.ID !== eventSlave.ID) { s.trust += 4; } }); + if (eventSlave.anus == 1) { + t.push(`Poor ${eventSlave.slaveName}'s butthole <span class="lime">isn't quite the same</span> afterward.`); + eventSlave.anus += 1; + } + eventSlave.trust -= 5; + return t; + } + + function analVirginWarning() { + if (eventSlave.anus === 0) { + return `This option will take ${his} anal virginity`; + } + } + } +}; diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js index 244abda7ad89baf7ee1576e4d283d5f298c4a22d..544035d463d07b1dca8d74d98d2387bc1f7c3da8 100644 --- a/src/events/randomEvent.js +++ b/src/events/randomEvent.js @@ -14,12 +14,14 @@ App.Events.getIndividualEvents = function() { new App.Events.RESSCockFeederResistance(), new App.Events.RESSComfortableSeat(), new App.Events.RESSDevotedAnalVirgin(), + new App.Events.RESSDevotedEducated(), new App.Events.RESSDevotedVirgin(), new App.Events.RESSDevotedWaist(), new App.Events.RESSEscapee(), new App.Events.RESSFrighteningDick(), new App.Events.RESSHotPC(), new App.Events.RESSImScared(), + new App.Events.RESSKitchenMolestation(), new App.Events.RESSLazyEvening(), new App.Events.RESSMoistPussy(), new App.Events.RESSMuscles(), diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js index d4aec3982ab2b0f3a99410cd1395a19f857cd0a6..5741b76c6c4016983ce073696276a8a77b16ebf7 100644 --- a/src/js/eventSelectionJS.js +++ b/src/js/eventSelectionJS.js @@ -48,16 +48,6 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) { } } - if (eventSlave.intelligence + eventSlave.intelligenceImplant > 50) { - if (eventSlave.devotion > 50) { - if (eventSlave.intelligenceImplant >= 15) { - if (eventSlave.accent < 4) { - V.RESSevent.push("devoted educated slave"); - } - } - } - } - if (eventSlave.skill.entertainment >= 60 || ["a ballerina", "a camgirl", "a camwhore", "a cheerleader", "a classical dancer", "a dancer", "a house DJ", "a party girl", "an aspiring pop star", "an exotic dancer", "an idol"].includes(eventSlave.career)) { if (canHear(eventSlave)) { if (eventSlave.health.condition > 40) { @@ -372,11 +362,6 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) { V.RETSevent.push("sadistic description"); } } - if (V.cockFeeder > 0) { - if (canPenetrate(eventSlave) || eventSlave.dick === 0) { - V.RESSevent.push("kitchen molestation"); - } - } } if (V.REIfYouEnjoyItSubIDs.length > 0) { V.RETSevent.push("if you enjoy it"); @@ -1678,11 +1663,6 @@ globalThis.generateRandomEventPoolServant = function(eventSlave) { V.RETSevent.push("sadistic description"); } } - if (V.cockFeeder > 0) { - if (canPenetrate(eventSlave) || eventSlave.dick === 0) { - V.RESSevent.push("kitchen molestation"); - } - } } if (V.REIfYouEnjoyItSubIDs.length > 0) { V.RETSevent.push("if you enjoy it"); diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js index e9ce09f5717847e01598c6e22b23a34e9f1eebe5..4acafb5e74e4c3a87efbb00d598196aaa2e22962 100644 --- a/src/js/slaveSummaryHelpers.js +++ b/src/js/slaveSummaryHelpers.js @@ -1104,6 +1104,7 @@ App.UI.SlaveSummaryImpl = function() { helpers.makeStyledSpan(c, sd.synergy.nymphomni); } else if (slave.attrXX > 95 && slave.attrXY > 95) { helpers.makeStyledSpan(c, sd.synergy.omni); + helpers.makeRatedStyledSpan(c, sd.energy, slave.energy, 0, true); } else { helpers.makeRatedStyledSpan(c, sd.XY, slave.attrXY, 0, true); helpers.makeRatedStyledSpan(c, sd.XX, slave.attrXX, 0, true); @@ -1191,6 +1192,7 @@ App.UI.SlaveSummaryImpl = function() { helpers.makeStyledSpan(c, sd.synergy.nymphomni); } else if (slave.attrXX > 95 && slave.attrXY > 95) { helpers.makeStyledSpan(c, sd.synergy.omni); + helpers.makeRatedStyledSpan(c, sd.energy, slave.energy, 0, true); } else { helpers.makeRatedStyledSpan(c, sd.XY, slave.attrXY, 0, true); helpers.makeRatedStyledSpan(c, sd.XX, slave.attrXX, 0, true); diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index 7e438078456e097621ff1e2fd4b3f17e67f9368f..52ef8aa7323f02d85fbded60ba0f8c5f16dc67dd 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -44,7 +44,7 @@ <<set _clothesTemp = $activeSlave.clothes>> <<switch $RESSevent>> /*Some events start with the slave naked (any event that starts with the daily inspection, for example). Here we switch their clothing just for the image to load, then switch it back quickly so the player's choice is not messed up.*/ -<<case "age implant" "ara ara" "back stretch" "bad dream" "bed snuggle" "bondage gear" "bonded love" "breast expansion blues" "confident tanning" "devoted educated slave" "devoted exhibition" "devoted lotion" "desperate null" "devoted nympho" "devoted shortstack" "extreme aphrodisiacs" "fearful balls" "fucktoy tribbing" "gaped asshole" "happy dance" "heavy piercing" "huge naturals" "huge tits" "hugely pregnant" "ignorant horny" "implant inspection" "kitchen molestation" "language lesson" "mindbroken morning" "modest clothes" "mods please" "old PC age difference" "orchiectomy please" "PA flirting" "penitent" "permitted masturbation" "plimb help" "rebellious arrogant" "resistant gelding" "resistant shower" "resting amp" "restricted profession" "restricted smart" "sexy succubus" "shaped areolae" "shift masturbation" "shift sleep" "shower slip" "slave clit on slave" "slave dick huge" "slave dick on slave" "sleeping ambivalent" "sore shoulders" "spa boobs" "subjugation blues" "tendon fall" "terrified inspection" "tittymonster inspection" "torpedo squeeze" "transition anxiety" "trusting HG" "unhappy virgin" "used whore" "vocal disobedience" "young PC age difference">> +<<case "age implant" "ara ara" "back stretch" "bad dream" "bed snuggle" "bondage gear" "bonded love" "breast expansion blues" "confident tanning" "devoted exhibition" "devoted lotion" "desperate null" "devoted nympho" "devoted shortstack" "extreme aphrodisiacs" "fearful balls" "fucktoy tribbing" "gaped asshole" "happy dance" "heavy piercing" "huge naturals" "huge tits" "hugely pregnant" "ignorant horny" "implant inspection" "language lesson" "mindbroken morning" "modest clothes" "mods please" "old PC age difference" "orchiectomy please" "PA flirting" "penitent" "permitted masturbation" "plimb help" "rebellious arrogant" "resistant gelding" "resistant shower" "resting amp" "restricted profession" "restricted smart" "sexy succubus" "shaped areolae" "shift masturbation" "shift sleep" "shower slip" "slave clit on slave" "slave dick huge" "slave dick on slave" "sleeping ambivalent" "sore shoulders" "spa boobs" "subjugation blues" "tendon fall" "terrified inspection" "tittymonster inspection" "torpedo squeeze" "transition anxiety" "trusting HG" "unhappy virgin" "used whore" "vocal disobedience" "young PC age difference">> <<set $activeSlave.clothes = "no clothing">> <<case "whore rebellious">> /* this scene states they are wearing "thick, durable latex with temperature regulation and anchor points for restraint" no matter what they are assigned to wear. */ @@ -2399,17 +2399,6 @@ To go by $his behavior, the likelihood that $he's actually eager to <<if $PC.dic $desc has run through the prescribed motions of a normal inspection, and you've reached the part of the routine where you usually ask the slave a few questions, give $him a few orders, or fuck $him. $His <<if canSee($activeSlave)>><<= App.Desc.eyesColor($activeSlave)>> are watching you closely<<else>>face is centered on you<</if>>, and $he's <<if canHear($activeSlave)>>listening carefully<<else>>waiting patiently<</if>> for direction. This is probably due to linguistic anxiety: $he can understand the most straightforward commands, but giving $him orders is often an exercise in <<if canSee($activeSlave)>>pointing and gesturing, or when that fails, simply<<else>>frustration, ending with you simply<</if>> pushing and pulling $his usually-compliant body into the proper place. -<<case "kitchen molestation">> - -<<= App.UI.slaveDescriptionDialog($activeSlave)>> is a horny bitch, and $he isn't particularly picky about how $he gets off. Since other slaves are not allowed to resist $his little molestations, $he's taken to haunting the kitchen around mealtimes. Since everyone has to suck their meals out of the phallic food dispensers, every slave has to spend some minutes of every day in the kitchen with their face to the wall and their rear defenseless. $activeSlave.slaveName does $his best to arrive as early as possible and eat as rapidly as possible so $he can then play with anyone who's slower to finish. -<br><br> -You decide to stop by to see $his method at work. By the time you arrive, $he's already eaten and orgasmed at least once. As you spectate, $he -<<if canPenetrate($activeSlave) && $activeSlave.prostate > 0>> - pushes a couple of fingers up $his own ass to use prostate stimulation to force $himself hard again, and once this is accomplished, happily turns to select a slow eater to fuck. -<<else>> - languidly plays with $himself, running $his hand<<if hasBothArms($activeSlave)>>s<</if>> over the various vulnerable butts before picking a victim to roughly finger fuck. -<</if>> - <<case "forbidden masturbation">> <<if $assistant.personality > 0>> @@ -3448,15 +3437,6 @@ As another long week draws to a close, <<= App.UI.slaveDescriptionDialog($active <</if>> -<<case "devoted educated slave">> - -<<= App.UI.slaveDescriptionDialog($activeSlave)>> comes before you for a routine inspection. The $desc is a well-educated and obedient slave. Though $he performs $his duties devotedly and to the best of $his abilities, slave life is not particularly conducive to straining an individual's brainpower. You happen to run into $activeSlave.slaveName in the hallways of the penthouse, where $he takes the opportunity to wordlessly signal $he wishes to gain your attention. -<<if !canTalk($activeSlave)>> - $He uses gestures to beg your pardon and explains that while $he enjoys life as your slave, $he doesn't feel like $his new role in your arcology allows $him to stimulate $his mind as often as it does $his body. -<<else>> - "<<Master>>," $he <<say>>s. "I really enjoy my role a<<s>> your <<s>>lave, but I ju<<s>>t don't feel like my new life <<s>>timulate<<s>> me." $He blushes prettily at $his choice of words before continuing, "<<S>>timulate my mind, I mean." -<</if>> - <<case "nice guys">> One afternoon, $assistant.name informs you $he that $he has a non-urgent matter that you might be interested in overseeing personally. @@ -12935,160 +12915,6 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h <</replace>> <</link>> -<<case "kitchen molestation">> - -<<link "Improve on $his abusive little game">> - <<setNonlocalPronouns $seeDicks>> - <<replace "#result">> - <<set $activeSlave.devotion += 4, $activeSlave.trust += 4>> - <<set _targetJobs = ["be a servant", "be a subordinate slave", "get milked", "learn in the schoolroom", "please you", "rest in the spa", "rest", "serve in the club", "serve the public", "take classes", "whore", "work a glory hole", "work as a servant", "work in the brothel"]>> - You leave for the moment, but appear at the next mealtime before even $he does. You shut off all the phallic feeders but one, and make an announcement. You decree that just for this one meal, $activeSlave.slaveName is to lie in front of the one functional feeder, - <<if canPenetrate($activeSlave)>>as - $his cock in the air; - <<else>> - with a dildo jutting up from $his crotch; - <</if>> - in order to eat, each slave must ride $activeSlave.slaveName for as long as it takes to suck down their meal<<if $activeSlave.belly >= 5000>> (given the _belly mass jutting from $his middle, it should be quite the sight)<</if>>. $activeSlave.slaveName gapes at you openmouthed for a long moment, looking like $he wants to @@.hotpink;declaim a speech of thanks,@@ but you cut $him off by pointing peremptorily at $his place; $he almost runs over, $his @@.mediumaquamarine;trust in your whim@@ nearly absolute. But the true shape of your plan isn't apparent yet. When the first slave seats _himselfU on $activeSlave.slaveName and starts sucking off the dispenser dildo, you crouch behind _himU and insert yourself as well; the bitch is now airtight. _HeU gags and splutters with the discomfort but keeps working away until _heU gets _hisU meal down and struggles off the three phalluses _heU has in _himU. The next in line gets to it with some trepidation: and so it goes, slave by slave. - <<for _ress = 0; _ress < $slaves.length; _ress++>> - <<if _targetJobs.includes($slaves[_ress].assignment) && hasAnyLegs($slaves[_ress]) && $slaves[_ress].relationship != -3 && _ress.ID != $activeSlave.ID>> - <<if canDoAnal($slaves[_ress]) && canDoVaginal($slaves[_ress])>> - <<if $slaves[_ress].anus == 0 && $slaves[_ress].vagina == 0>> - <<set _virgins = 1>> - <<elseif $slaves[_ress].vagina == 0>> - <<set _virgins = 1, _anusOnly = 1>> - <<run seX($slaves[_ress], "anal", $activeSlave, "penetrative")>> - <<run seX($slaves[_ress], "anal", $PC, "penetrative")>> - <<if canImpreg($slaves[_ress], $PC)>> - <<= knockMeUp($slaves[_ress], 5, 1, -1, 1)>> - <</if>> - <<if canImpreg($slaves[_ress])>> - <<= knockMeUp($slaves[_ress], 5, 1, $activeSlave.ID, 1)>> - <</if>> - <<if ($slaves[_ress].anus == 1)>> - <<set $slaves[_ress].trust -= 2>> - <<set _doubleAnal = 1>> - <</if>> - <<elseif $slaves[_ress].anus == 0>> - <<set _virgins = 1, _pussyOnly = 1>> - <<run seX($slaves[_ress], "vaginal", $activeSlave, "penetrative")>> - <<run seX($slaves[_ress], "vaginal", $PC, "penetrative")>> - <<if canImpreg($slaves[_ress], $PC)>> - <<= knockMeUp($slaves[_ress], 5, 0, -1, 1)>> - <</if>> - <<if canImpreg($slaves[_ress])>> - <<= knockMeUp($slaves[_ress], 5, 0, $activeSlave.ID, 1)>> - <</if>> - <<if ($slaves[_ress].vagina == 1)>> - <<set $slaves[_ress].trust -= 2>> - <<set _doubleVaginal = 1>> - <</if>> - <<else>> - <<run seX($slaves[_ress], "anal", $activeSlave, "penetrative")>> - <<run seX($slaves[_ress], "vaginal", $activeSlave, "penetrative")>> - <<if canImpreg($slaves[_ress], $PC)>> - <<= knockMeUp($slaves[_ress], 5, 2, -1, 1)>> - <</if>> - <<if canImpreg($slaves[_ress])>> - <<= knockMeUp($slaves[_ress], 5, 1, $activeSlave.ID, 1)>> - <</if>> - <</if>> - <<elseif canDoVaginal($slaves[_ress])>> - <<set _pussyOnly = 1>> - <<run seX($slaves[_ress], "vaginal", $activeSlave, "penetrative")>> - <<run seX($slaves[_ress], "vaginal", $PC, "penetrative")>> - <<if canImpreg($slaves[_ress], $PC)>> - <<= knockMeUp($slaves[_ress], 5, 0, -1, 1)>> - <</if>> - <<if canImpreg($slaves[_ress])>> - <<= knockMeUp($slaves[_ress], 5, 0, $activeSlave.ID, 1)>> - <</if>> - <<if ($slaves[_ress].vagina == 1)>> - <<set $slaves[_ress].trust -= 2>> - <<set _doubleVaginal = 1>> - <</if>> - <<elseif canDoAnal($slaves[_ress])>> - <<set _anusOnly = 1>> - <<run seX($slaves[_ress], "anal", $activeSlave, "penetrative")>> - <<run seX($slaves[_ress], "anal", $PC, "penetrative")>> - <<if canImpreg($slaves[_ress], $PC)>> - <<= knockMeUp($slaves[_ress], 5, 1, -1, 1)>> - <</if>> - <<if canImpreg($slaves[_ress])>> - <<= knockMeUp($slaves[_ress], 5, 1, $activeSlave.ID, 1)>> - <</if>> - <<if ($slaves[_ress].anus == 1)>> - <<set $slaves[_ress].trust -= 2>> - <<set _doubleAnal = 1>> - <</if>> - <<else>> - <<set _chaste = 1>> - <</if>> - <<if ($slaves[_ress].fetishKnown == 1) && ($slaves[_ress].fetish == "submissive")>> - <<set $slaves[_ress].devotion++>> - <<set _subLove = 1>> - <</if>> - <</if>> - <</for>> - <<if def _virgins>> - You let your virgins<<if def _chaste>> and chaste slaves<</if>> hold their thighs tight together for a little frottage rather than deflowering their holes like this. - <<elseif def _chaste>> - Your chaste slaves hold their thighs tight together for a little frottage should they lack the ability to accommodate. - <</if>> - <<if def _anusOnly>> - Those slaves without pussies are forced to take both you and $activeSlave.slaveName up the butt at once. - <<if def _doubleAnal>> - Experienced assholes can take the strain just fine, but your tighter-assed slaves are @@.gold;frightened@@ by the anal pain they suffer. - <</if>> - <</if>> - <<if def _pussyOnly>> - Slaves with off-limit assholes quickly find both you and $activeSlave.slaveName delving the depths of their cunts. - <<if def _doubleVaginal>> - Experienced sluts can take the double penetration just fine, but your tighter slaves are @@.gold;frightened@@ by the amount of stretching they are forced to undergo. - <</if>> - <</if>> - <<if def _subLove>> - Your subs on the other hand think this is @@.hotpink;a meal worth remembering.@@ - <</if>> - <</replace>> -<</link>> -<<if canDoAnal($activeSlave)>> - <br><<link "The rule about consent works both ways">> - <<replace "#result">> - <<set _targetJobs = ["be a servant", "be a subordinate slave", "get milked", "learn in the schoolroom", "please you", "rest in the spa", "rest", "serve in the club", "serve the public", "take classes", "whore", "work a glory hole", "work as a servant", "work in the brothel"]>> - You tell $activeSlave.slaveName to get up on the kitchen counter and spread $his legs. $He catches something in the tone of your voice and looks frightened, but obeys. You then make several conversational observations, as though for no particular reason, to the rest of the slaves. First, you point out, the consent rule works for everyone: they, hypothetically, would not need to ask $activeSlave.slaveName $his permission to fuck $his ass, just like $he doesn't have to ask their permission to molest them during meals. (At this $activeSlave.slaveName's fear deepens into obvious @@.gold;terror.@@) Second, you have decided $activeSlave.slaveName will not be getting down off the counter until everyone's done with their meals — and anything else they wish to do in the kitchen. And third, you conclude, any number of large strap-ons and dildos can be found in the kitchen cabinets. There is a general rush for these; you tell $activeSlave.slaveName, whose - <<if $activeSlave.lips > 40>> - bimbo - <<elseif $activeSlave.lips > 20>> - big - <<elseif $activeSlave.lips > 10>> - soft - <</if>> - lips are quivering, to come see you after $he's done here. About an hour later, $he hobbles into your office, and you tell $him to show you $his anus. $His longtime targets for mealtime molestation were not merciful; they weren't stupid enough to damage $him, but that's one well-gaped butthole. You fuck it anyway, and $he's too tired and desensitized to care. Your less trusting slaves carefully consider the rules, and realize that there's a @@.mediumaquamarine;built-in mechanism for correction:@@ if anyone gets too rapey, they can rape them right back. - <<set $activeSlave.trust -= 5>> - <<= VCheck.Anal(20)>> - <<if canGetPregnant($activeSlave) && $activeSlave.mpreg == 1>> - <<set _sourceSeed = random(0,$slaves.length-1)>> - <<for _ress = _sourceSeed + 1; _ress != _sourceSeed; _ress++>> - <<if _ress == $slaves.length>><<set _ress = 0>><</if>> /* wrap around */ - <<if canImpreg($activeSlave, $slaves[_ress]) && _targetJobs.includes($slaves[_ress].assignment) && $slaves[_ress].ID != $activeSlave.ID>> - <<= knockMeUp($activeSlave, 50, 1, $slaves[_ress].ID, 1)>> - <<break>> - <</if>> - <</for>> - <</if>> - <<for _ress = 0; _ress < $slaves.length; _ress++>> - <<if ($slaves[_ress].trust < 50) && _targetJobs.includes($slaves[_ress].assignment)>> - <<set $slaves[_ress].trust++>> - <</if>> - <</for>> - <<if $activeSlave.anus == 1>> - Poor $activeSlave.slaveName's butthole @@.lime;isn't quite the same@@ afterward. - <<set $activeSlave.anus += 1>> - <</if>> - <</replace>> - <</link>><<if $activeSlave.anus == 0>> //This option will take $his anal virginity//<</if>> -<</if>> - <<case "forbidden masturbation">> <<link "Let $him earn relief">> @@ -16874,76 +16700,6 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h <</link>> //This option will render $activeSlave.slaveName pregnant//<<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>> //and take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //and take $his anal virginity//<</if>> <</if>> -<<case "devoted educated slave">> - -<<link "Have a conversation with $him">> - <<replace "#result">> - You linger in the hallway a while with $activeSlave.slaveName and enjoy a brief but verbose discussion. It's clear $he hasn't had the chance to engage in any meaningful conversations in a while, so $he relishes the opportunity energetically. - <br><br> - Though the two of you only touch upon a handful of sophisticated topics, by the time you leave $him to tend to other matters, $activeSlave.slaveName is beaming happily as $he continues on to $his duties for the day. $He @@.mediumaquamarine;trusts you more@@ for taking the time to engage with $him intellectually. - <<set $activeSlave.trust += 4>> - <</replace>> -<</link>> -<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>> - <br><<link "Stimulate $his mind and body">> - <<replace "#result">> - You find a comfortable seat to sit on <<if $PC.dick == 0>>,don a strap-on,<</if>>as $he seats $his - <<if $activeSlave.butt < 2>> - narrow - <<elseif $activeSlave.butt < 5>> - average - <<elseif $activeSlave.butt < 8>> - plump - <<elseif $activeSlave.butt < 12>> - impressive - <<else>> - mind-blowing - <</if>> - ass on your <<if $PC.dick == 0>>strap-on<<else>>dick<</if>> and rides you. While your cock plumbs the depths of $his - <<if canDoVaginal($activeSlave)>> - pussy, - <<else>> - butt, - <</if>> - the two of you engage in a casual debate over a number of topics of sophistry. - <br><br> - At the crux of one of $his concluding arguments, the intense pleasure from the prolonged - <<if canDoVaginal($activeSlave)>> - fucking - <<else>> - buttfucking - <</if>> - pushes $him over the edge into orgasm, robbing the thrust of $his defense of any gravitas it once had. $He doesn't seem to mind however, choosing to instead wrap up $his remarks by @@.hotpink;blowing you a kiss.@@ - <<set $activeSlave.devotion += 4>> - <<if canDoVaginal($activeSlave)>> - <<= VCheck.Vaginal()>> - <<else>> - <<= VCheck.Anal()>> - <</if>> - <</replace>> - <</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>> -<</if>> -<<if $arcologies[0].FSDegradationist !== "unset">> - <br><<link "A public blowbang will show $him what a Degradationist arcology thinks about 'educated' slaves">> - <<replace "#result">> - You tell $him $he'll get fucked in the mouth until $he either gets over the idea of being special for $his education or until all $his learning is fucked out of $his head. You drag the protesting $activeSlave.slaveName out into a public plaza, restrain $him in stocks so that $his mouth is available, and inform the gathering crowd of citizens that this particular slave thinks $himself more than a fuckhole because of some fancy 'education'. - <br><br> - When you return later in the evening, it becomes abundantly clear that your citizenry taught $activeSlave.slaveName a harsh lesson about a slave's place in $arcologies[0].name. $activeSlave.slaveName has certainly @@.green;learned to keep any pretentious thoughts about $his education in $his head.@@ $He did, however, @@.red;have quite a rough time@@ sucking all those dicks<<if $activeSlave.skill.oral <= 30>>, though $he did learn about sucking dick, so $he can't claim enslavement isn't educational.<<= SkillIncrease.Oral($activeSlave, 10)>><<else>>.<</if>> And last of all, you and $activeSlave.slaveName did make @@.green;quite a good impression@@ today, though for widely differing reasons. - <<run seX($activeSlave, "oral", "public", "penetrative", random(65,80))>> - <<run repX(500, "event", $activeSlave), healthDamage($activeSlave, 10)>> - <</replace>> - <</link>> -<<elseif $arcologies[0].FSPaternalist !== "unset">> - <br><<link "Allow $him to audit some advanced classes at Paternalist slave schools">> - <<replace "#result">> - You tell $him to take the day off for a trip to audit classes at $arcologies[0].name's most renowned Paternalist slave schools. $activeSlave.slaveName is shocked into a reverie by your words before running to wrap $his arms around you in a tight hug. When $he eventually untangles $himself from you, $he races off to get ready for $his day of intellectualism while you direct $assistant.name to make the necessary arrangements. - <br><br> - When $activeSlave.slaveName returns, $he looks exhausted but happier than you've ever seen $him. It seems $he benefited greatly from $arcologies[0].name's Paternalist institutions, and has grown to @@.mediumaquamarine;trust you more@@ while also @@.hotpink;deepening $his acceptance of slavery.@@ - <<set $activeSlave.trust += 4, $activeSlave.devotion += 4>> - <</replace>> - <</link>> -<</if>> - <<case "nice guys">> <<link "Let the boys be">>