diff --git a/README.md b/README.md index 89a4fb193eeb0fbdf5100d44e295b6ed6d01d888..06adff9b1fa11db47e60243fd8064ce985bc50e8 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,10 @@ To play open FC_pregmod.html in bin/ (Recommendation: Drag it into incognito mod ## Common problems +* If compiling takes a while or causes a noticeable increase in system resource utilisation. + - It might be worth checking your main Antivirus (AV) settings. + - If it is Windows Defender (currently tested with Windows 10): Start menu -> Windows Security -> Virus & threat protection -> Virus & threat protection settings -> Manage settings -> Exclusions (near the bottom) -> Add or remove exclusions -> Add an exclusion -> path to bin/. + * `sessionStorage quota exceeded` / `localStorage quota exceeded` or something similar - Your saves stored inside the browser are getting too large. There are multiple ways to solve this: 1. Delete saves stored in the browser. If you want to keep them, save them to disk first. diff --git a/devTools/types/FC/facilities.d.ts b/devTools/types/FC/facilities.d.ts index 93e723e1bd6e42c62b644bc20ad3f7f695fb8d46..ac7eb1e90a3a22c2bfabef8730f28138a5421b19 100644 --- a/devTools/types/FC/facilities.d.ts +++ b/devTools/types/FC/facilities.d.ts @@ -1,40 +1,46 @@ declare namespace FC { + export type Upgrade = InstanceType<typeof App.Upgrade>; + + interface IUpgrade { + /** The variable name of the upgrade. */ + property: string; + /** Properties pertaining to any tiers available. */ + tiers: IUpgradeTier[]; + /** Any object the upgrade property is part of, if not the default `V`. */ + object?: Object; + } + + interface IUpgradeTier { + /** The value to set `property` to upon purchase. */ + value: any; + /** The link text. */ + link?: string; + /** The text to display when the upgrade is available to purchase. */ + base?: string; + /** The text to display when the upgrade has been purchased and no additional upgrades are available. */ + upgraded?: string; + /** How much the upgrade costs. */ + cost?: number; + /** Any handler to run upon purchase. */ + handler?: () => void; + /** Any additional information to display upon hover on the link. */ + note?: string; + /** + * Any prerequisites that must be met before the upgrade is available. + * + * If none are given, the upgrade will always be available. + */ + prereqs?: Array<() => boolean> + /** Any additional nodes to attach. */ + nodes?: Array<string|HTMLElement|DocumentFragment> + } + namespace Facilities { export type Facility = InstanceType<typeof App.Facilities.Facility>; export type Animal = InstanceType<typeof App.Entity.Animal>; interface Decoration extends Record<FC.FutureSocietyDeco, string> {} - interface Upgrade { - /** The variable name of the upgrade. */ - property: string; - /** Any prerequisites that must be met before the upgrade is available. */ - prereqs: Array<() => boolean>; - /** Properties pertaining to any tiers available. */ - tiers: Array<{ - /** The value to set `property` to upon purchase. */ - value: any; - /** The link text. */ - link?: string; - /** The text to display when the upgrade is available to purchase. */ - base?: string; - /** The text to display when the upgrade has been purchased and no additional upgrades are available. */ - upgraded?: string; - /** How much the upgrade costs. */ - cost?: number; - /** Any handler to run upon purchase. */ - handler?: () => void; - /** Any additional information to display upon hover on the link. */ - note?: string; - /** Any prerequisites that must be met for the upgrade to be available for purchase. */ - prereqs?: Array<() => boolean> - /** Any additional nodes to attach. */ - nodes?: Array<string|HTMLElement|DocumentFragment> - }>; - /** Any object the upgrade property is part of, if not the default `V`. */ - object?: Object; - } - interface Rule { /** The variable name of the rule. */ property: string diff --git a/devTools/types/FC/human.d.ts b/devTools/types/FC/human.d.ts index a4fd526e04fcce3f11ac9a5cfde3a91365527179..b4565ff0d7a35f68058b3219f4a8b8115c5130d8 100644 --- a/devTools/types/FC/human.d.ts +++ b/devTools/types/FC/human.d.ts @@ -14,7 +14,7 @@ declare global { } export interface GingeredSlave extends SlaveState { - // note that all members are optional...GingeredSlave and SlaveState are bidirectionally interchangable + // note that all members are optional...GingeredSlave and SlaveState are bidirectionally interchangeable gingering?: InstanceType<typeof App.Entity.GingeringParameters>; beforeGingering?: SlaveState; } diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index ebdae0d3450e541ed23c949b3033221cfadc1403..d366e2ad04ba636e2c7da0ac9a114527c2c11c31 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -141,6 +141,8 @@ App.Data.defaultGameStateVariables = { setSuperSampling: 2, setZoomSpeed: 1, setFaceCulling: false, + setTextureResolution: 1024, + setColorBurn: true, showAgeDetail: 1, showAppraisal: 1, showAssignToScenes: 1, @@ -808,6 +810,7 @@ App.Data.resetOnNGPlus = { milkPipeline: 0, cumPipeline: 0, wcPiping: 0, + /** @type {Map<number, "oldAge"|"overdosed"|"lowHealth">} */ slaveDeath: new Map(), playerBred: 0, playerBredTube: 0, diff --git a/src/004-base/facilityFramework.js b/src/004-base/facilityFramework.js index 0a330259ef4da09da80b6a2d69ac1cf7d4bacc93..88bfdfd9995aec1a24f071f8a298b5ae6194e67d 100644 --- a/src/004-base/facilityFramework.js +++ b/src/004-base/facilityFramework.js @@ -15,7 +15,7 @@ App.Facilities.Facility = class { this._div = document.createElement("div"); /** @protected @type {Array<function():HTMLDivElement>} */ this._sections = []; - /** @protected @type {FC.Facilities.Upgrade[]} */ + /** @protected @type {FC.IUpgrade[]} */ this._upgrades = []; /** @protected @type {FC.Facilities.Rule[]} */ this._rules = []; @@ -85,7 +85,7 @@ App.Facilities.Facility = class { /** * Adds new purchaseable upgrades. - * @param {...FC.Facilities.Upgrade} upgrades + * @param {...FC.IUpgrade} upgrades * * @private * @returns {void} @@ -169,48 +169,15 @@ App.Facilities.Facility = class { _makeUpgrades() { const div = document.createElement("div"); - if (this.upgrades.length > 0 && this.upgrades.some(upgrade => upgrade.prereqs.every(prereq => prereq()))) { + if (this.upgrades.length > 0) { App.UI.DOM.appendNewElement("h2", div, `Upgrades`); - } - this._upgrades.forEach(upgrade => { - if (upgrade.prereqs.every(prereq => prereq())) { - upgrade.tiers.forEach(tier => { - tier.cost = Math.trunc(tier.cost) || 0; - - if (!tier.prereqs || tier.prereqs.every(prereq => prereq())) { - if (tier.upgraded - && (upgrade.object && _.isEqual(upgrade.object[upgrade.property], tier.value)) - || (_.isEqual(V[upgrade.property], tier.value))) { - App.UI.DOM.appendNewElement("div", div, tier.upgraded); - } else { - App.UI.DOM.appendNewElement("div", div, tier.base); - App.UI.DOM.appendNewElement("div", div, App.UI.DOM.link(tier.link, () => { - cashX(forceNeg(tier.cost), "capEx"); - - if (upgrade.object) { - upgrade.object[upgrade.property] = tier.value; - } else { - V[upgrade.property] = tier.value; - } - - if (tier.handler) { - tier.handler(); - } - - this.refresh(); - }, [], '', - `${tier.cost > 0 ? `Costs ${cashFormat(tier.cost)}` : `Free`}${tier.note ? `${tier.note}` : ``}.`), - ['indent']); - - if (tier.nodes) { - App.Events.addNode(div, tier.nodes); - } - } - } - }); - } - }); + this._upgrades.forEach(u => { + const upgrade = new App.Upgrade(u.property, u.tiers, u.object); + + div.append(upgrade.render()); + }); + } return div; } @@ -362,6 +329,10 @@ App.Facilities.Facility = class { return div; } + // Getters and Setters + + // Getters that returns a nullish type are used for type checking and autocompletion. + /** * The text displayed in the intro scene. * @@ -394,7 +365,7 @@ App.Facilities.Facility = class { /** * Any upgrades available for purchase. * - * @returns {FC.Facilities.Upgrade[]} + * @returns {FC.IUpgrade[]} */ get upgrades() { return []; diff --git a/src/art/artJS.js b/src/art/artJS.js index 1ae87f071f5d2b6ecb109c762fa2c165b50b087f..6c759a847392041f847cbc25748d82db073d8641 100644 --- a/src/art/artJS.js +++ b/src/art/artJS.js @@ -13,7 +13,7 @@ Macro.add("SlaveArt", { App.Art.SlaveArtBatch = class { /** Prepare to render art in the same format for multiple slaves within a single passage context. * Do not persist this object across passage contexts. - * @param {number[]} artSlaveIDs + * @param {Iterable<number>} artSlaveIDs * @param {number} artSize Image size/center: * * 3: Large, right. Example: long slave description. * * 2: Medium, right. Example: random events. diff --git a/src/art/webgl/art.js b/src/art/webgl/art.js index 8dc4a3a80c9c8f2e24903782a3c527a4437eb0b4..c14a86e54603bff2ad51de64ab58aa5ccef648f9 100644 --- a/src/art/webgl/art.js +++ b/src/art/webgl/art.js @@ -645,7 +645,7 @@ App.Art.applySurfaces = function(slave, scene, p) { let O = App.Art.hexToRgb(skinColorCatcher(slave).skinColor); let A = [207/255, 198/255, 195/255]; - let B = [201/255, 157/255, 134/2555]; + let B = [201/255, 157/255, 134/255]; let C = [174/255, 128/255, 100/255]; let D = [112/255, 78/255, 62/255]; @@ -1133,18 +1133,22 @@ App.Art.applyMaterials = function(slave, scene, p) { materials.push(["Sclera_Left", "Kd", [scleraColorLeft[0] * 0.6, scleraColorLeft[1] * 0.6, scleraColorLeft[2] * 0.56]]); materials.push(["Sclera_Right", "Kd", [scleraColorRight[0] * 0.6, scleraColorRight[1] * 0.6, scleraColorRight[2] * 0.56]]); + // expected skin color let O = App.Art.hexToRgb(skinColorCatcher(slave).skinColor); + // average color of skintone texture let A = [207/255, 198/255, 195/255]; - let B = [201/255, 157/255, 134/2555]; + let B = [201/255, 157/255, 134/255]; let C = [174/255, 128/255, 100/255]; let D = [112/255, 78/255, 62/255]; + // find nearest skintone texture let sqAO = (A[0] - O[0])**2 + (A[1] - O[1])**2 + (A[2] - O[2])**2; let sqBO = (B[0] - O[0])**2 + (B[1] - O[1])**2 + (B[2] - O[2])**2; let sqCO = (C[0] - O[0])**2 + (C[1] - O[1])**2 + (C[2] - O[2])**2; let sqDO = (D[0] - O[0])**2 + (D[1] - O[1])**2 + (D[2] - O[2])**2; + // factor to multiply skintone texture to get expected skin color let mA = [O[0]/A[0], O[1]/A[1], O[2]/A[2]]; let mB = [O[0]/B[0], O[1]/B[1], O[2]/B[2]]; let mC = [O[0]/C[0]*0.84, O[1]/C[1]*0.84, O[2]/C[2]*0.84]; @@ -1203,7 +1207,7 @@ App.Art.applyMaterials = function(slave, scene, p) { materials.push(["LightToneAnus", "Ks", S]); materials.push(["LightToneGenitalia", "Kd", mB]); materials.push(["LightToneGenitalia", "Ks", S]); - materials.push(["LightFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [mB[0]*0.8, mB[1]*0.8, mB[2]*0.8]]); + materials.push(["LightFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Kd", [mB[0]*0.8, mB[1]*0.77, mB[2]*0.80]]); materials.push(["LightFutalicious_Genitalia_G8F_Glans_Futalicious_Shell", "Ks", S]); materials.push(["nipple_mask", "Kd", [areolaColor[0]*0.8/B[0], areolaColor[1]*0.8/B[1], areolaColor[2]*0.8/B[2]]]); materials.push(["nipple_mask", "map_Kd", "base2/skin/torso light.jpg"]); diff --git a/src/art/webgl/engine.js b/src/art/webgl/engine.js index 93fcb80f2b095a70d0533d25dc1b2468ecf7347f..4b4e5608758fe14393430ba9dbc97c06e5e4d0fa 100644 --- a/src/art/webgl/engine.js +++ b/src/art/webgl/engine.js @@ -104,6 +104,7 @@ App.Art.Engine = class { uniform float sGamma; uniform float sReinhard; uniform float sNormal; + uniform float sColorBurn; uniform vec3 lookDir; @@ -157,9 +158,11 @@ App.Art.Engine = class { vec3 La = vec3(0.0,0.0,0.0); vec3 Le = map_Ke; - float l1 = dot(map_Kd, vec3(0.2126,0.7152,0.0722)); - float l2 = dot(map_Kd * map_Kd, vec3(0.2126,0.7152,0.0722)); - map_Kd = l1/(l2+0.0001) * map_Kd * map_Kd; + if (sColorBurn == 1.0) { + float l1 = dot(map_Kd, vec3(0.2126,0.7152,0.0722)); + float l2 = dot(map_Kd * map_Kd, vec3(0.2126,0.7152,0.0722)); + map_Kd = l1/(l2+0.0001) * map_Kd * map_Kd; + } map_Ka = map_Kd * map_Ka; @@ -370,6 +373,34 @@ App.Art.Engine = class { let img = document.createElement("img"); img.onload = function() { + // resize + let width = img.width; + let height = img.height; + let aspect = parseFloat(height / width); + + let textureSize = 1024; + if(typeof V.setTextureResolution !== "undefined") { + textureSize = V.setTextureResolution; + } + + if (width > textureSize || height > textureSize) { + if (width > textureSize) { + width = textureSize; + height = parseInt(width * aspect); + } + if (height > textureSize) { + height = textureSize; + width = parseInt(width / aspect); + } + + let canvas = document.createElement("canvas"); + let ctx = canvas.getContext("2d"); + canvas.width = width; + canvas.height = height; + ctx.drawImage(img, 0, 0, width, height); + img = canvas; + } + gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); @@ -524,6 +555,11 @@ App.Art.Engine = class { let matView = this.matrixInverse(matCamera); // set scene uniforms + let sColorBurn = true; + if(typeof V.setColorBurn !== "undefined") { + sColorBurn = V.setColorBurn; + } + this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sNormals"), sceneParams.settings.normals); this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sAmbient"), sceneParams.settings.ambient); this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sDiffuse"), sceneParams.settings.diffuse); @@ -535,6 +571,7 @@ App.Art.Engine = class { this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sGamma"), sceneParams.settings.gamma); this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "whiteM"), sceneParams.settings.whiteM); this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "gammaY"), sceneParams.settings.gammaY); + this.gl.uniform1f(this.gl.getUniformLocation(this.shaderProgram, "sColorBurn"), Number(sColorBurn)); for (let i = 0; i < sceneParams.directionalLights.length; i++) { let lightVect = this.polarToCart(this.degreeToRad(sceneParams.directionalLights[i].yr), this.degreeToRad(sceneParams.directionalLights[i].xr)); diff --git a/src/endWeek/events/death.js b/src/endWeek/events/death.js index 6b3b124ebca49d457e7791ed16366f5a78e7b038..af9ed44407ac26922287ba547ee413ace92d2c6b 100644 --- a/src/endWeek/events/death.js +++ b/src/endWeek/events/death.js @@ -18,6 +18,11 @@ App.Events.SEDeath = class SEDeath extends App.Events.BaseEvent { } execute(node) { + const artRenderer = V.seeImages && V.seeReportImages ? new App.Art.SlaveArtBatch(V.slaveDeath.keys(), 0, 0) : null; + if (artRenderer) { + node.append(artRenderer.writePreamble()); + } + for (const [id, deathType] of V.slaveDeath) { const deceased = getSlave(id); if (deceased) { @@ -47,8 +52,8 @@ App.Events.SEDeath = class SEDeath extends App.Events.BaseEvent { He, His, he, his } = getPronouns(slave); - if (V.seeImages) { - App.UI.DOM.appendNewElement("div", el, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]); + if (artRenderer) { + App.UI.DOM.appendNewElement("div", el, artRenderer.render(slave), ["imageRef", "tinyImg"]); } switch (deathType) { diff --git a/src/endWeek/events/expire.js b/src/endWeek/events/expire.js index ef2c58d67e0c57c02360a89d682b964f7e396a43..85cb09d24eb8241ed364ee10ab573d18ccfc1874 100644 --- a/src/endWeek/events/expire.js +++ b/src/endWeek/events/expire.js @@ -12,6 +12,11 @@ App.Events.SEExpiration = class SEExpiration extends App.Events.BaseEvent { execute(node) { V.encyclopedia = "Indentured Servants"; const _this = this; + const artRenderer = V.seeImages && V.seeReportImages ? new App.Art.SlaveArtBatch(_this.actors, 0, 0) : null; + if (artRenderer) { + node.append(artRenderer.writePreamble()); + } + for (const id of _this.actors) { const slave = getSlave(id); if (slave) { @@ -45,8 +50,8 @@ App.Events.SEExpiration = class SEExpiration extends App.Events.BaseEvent { he, his, him, himself, woman } = getPronouns(slave); const {title: Master} = getEnunciation(slave); - if (V.seeImages) { - App.UI.DOM.appendNewElement("div", el, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]); + if (artRenderer) { + App.UI.DOM.appendNewElement("div", el, artRenderer.render(slave), ["imageRef", "tinyImg"]); } r.push(`${slave.slaveName}'s indentured servitude is ending this week, meaning that your arcology is gaining a citizen.`); diff --git a/src/endWeek/events/retire.js b/src/endWeek/events/retire.js index ccaaf57d8f2641c55667d29c1f7dc03594b63f61..8448bf6549fd87cc08025217e0651584b1cc583f 100644 --- a/src/endWeek/events/retire.js +++ b/src/endWeek/events/retire.js @@ -10,6 +10,11 @@ App.Events.SERetire = class SERetire extends App.Events.BaseEvent { } execute(node) { + const artRenderer = V.seeImages && V.seeReportImages ? new App.Art.SlaveArtBatch(this.actors, 2, 0) : null; + if (artRenderer) { + node.append(artRenderer.writePreamble()); + } + for (const id of this.actors) { const slave = getSlave(id); if (slave) { @@ -27,10 +32,10 @@ App.Events.SERetire = class SERetire extends App.Events.BaseEvent { }; /** - * * @param {App.Entity.SlaveState} originalSlave + * @param {App.Art.SlaveArtBatch} [artRenderer] */ -globalThis.retireScene = function(originalSlave) { +globalThis.retireScene = function(originalSlave, artRenderer) { const el = new DocumentFragment(); const slave = clone(originalSlave); removeSlave(originalSlave); @@ -49,7 +54,7 @@ globalThis.retireScene = function(originalSlave) { } const {heU, hisU, himU, girlU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U'); - const art = (V.seeImages) ? App.UI.DOM.appendNewElement("div", el, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]) : document.createElement("div"); + const art = (V.seeImages) ? App.UI.DOM.drawOneSlaveRight(el, slave, artRenderer) : document.createElement("div"); const desc = App.UI.DOM.appendNewElement("div", el); const result = App.UI.DOM.appendNewElement("div", el); diff --git a/src/endWeek/reports/arcadeReport.js b/src/endWeek/reports/arcadeReport.js index e35ddd2adff93972ea58804a61866408562d912a..2101e8e2011a64bfb21f2fdc673d89430edd5268 100644 --- a/src/endWeek/reports/arcadeReport.js +++ b/src/endWeek/reports/arcadeReport.js @@ -271,8 +271,7 @@ App.EndWeek.arcadeReport = function() { milkProfits += milk(slave); slave.boobs += boobGrowth(slave); if ( - (slave.balls > 0) && - (slave.balls < 10) && + slave.balls.isBetween(0, 10) && (random(1, 100) > (40 + (10 * (slave.balls + (2 * slave.geneMods.NCS))))) ) { slave.balls++; diff --git a/src/endWeek/reports/penthouseReport.js b/src/endWeek/reports/penthouseReport.js index 2248460d249cfa572611c4f1d0b0de381f3f3dab..1fe638b39fd6136b0846274b4249b86ad4827a3e 100644 --- a/src/endWeek/reports/penthouseReport.js +++ b/src/endWeek/reports/penthouseReport.js @@ -20,7 +20,7 @@ App.EndWeek.penthouseReport = function() { for (const slave of App.SlaveAssignment.reportSlaves(penthouseSlaves)) { const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); if (penthouseArtRenderer) { - App.UI.DOM.appendNewElement("div", slaveEntry, penthouseArtRenderer.render(slave), ["imageRef", "medImg"]); + App.UI.DOM.drawOneSlaveRight(slaveEntry, slave, penthouseArtRenderer); } App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); slaveEntry.append(fullReport(slave)); @@ -28,22 +28,21 @@ App.EndWeek.penthouseReport = function() { if (slave.ID === V.HeadGirlID && hgSlave) { /* Output the HG's slave immediately after the hg */ const {He2, he2} = getPronouns(hgSlave).appendSuffix("2"); - const r = []; + const hgSlaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); if (hgSlave.assignment !== Job.HEADGIRLSUITE) { - r.push(`<span class="red">${hgSlave.slaveName} had been assigned to live with your Head Girl, but this week ${he2} was assigned to ${hgSlave.assignment}. ${He2} has been released to your penthouse for reassignment.</span>`); + App.UI.DOM.appendNewElement("span", hgSlaveEntry, `${hgSlave.slaveName} had been assigned to live with your Head Girl, but this week ${he2} was assigned to ${hgSlave.assignment}. ${He2} has been released to your penthouse for reassignment.`, "warning"); removeJob(hgSlave, Job.HEADGIRLSUITE); } else { - r.push(App.UI.DOM.makeElement("span", SlaveFullName(hgSlave), "slave-name")); - if (hgSlave.choosesOwnAssignment === 2) { - r.push(App.SlaveAssignment.choosesOwnJob(hgSlave)); - r.push(He2); - } if (penthouseArtRenderer) { - r.push(App.UI.DOM.makeElement("div", penthouseArtRenderer.render(hgSlave), ["imageRef", "medImg"])); + App.UI.DOM.drawOneSlaveRight(hgSlaveEntry, hgSlave, penthouseArtRenderer); + } + App.SlaveAssignment.appendSlaveLinks(hgSlaveEntry, hgSlave); + App.UI.DOM.appendNewElement("span", hgSlaveEntry, SlaveFullName(hgSlave), "slave-name"); + if (hgSlave.choosesOwnAssignment === 2) { + hgSlaveEntry.append(App.SlaveAssignment.choosesOwnJob(hgSlave), ` ${He2}`); } - r.push(App.SlaveAssignment.liveWithHG(hgSlave)); + hgSlaveEntry.append(` `, App.SlaveAssignment.liveWithHG(hgSlave)); } - App.Events.addNode(el, r, "div", "slave-report"); } } diff --git a/src/events/PETS/petsAggressiveWardeness.js b/src/events/PETS/petsAggressiveWardeness.js index 0fcc0f24f34a0d3e94dc8fe37579c617a9b71808..022750b6bc0601619828b58fc58fa209dd4f7b94 100644 --- a/src/events/PETS/petsAggressiveWardeness.js +++ b/src/events/PETS/petsAggressiveWardeness.js @@ -29,7 +29,8 @@ App.Events.petsAggressiveWardeness = class petsAggressiveWardeness extends App.E App.Events.addParagraph(node, [ `As you pass the entrance to the hall of cells where`, App.UI.DOM.slaveDescriptionDialog(S.Wardeness), - `breaks bitches late one night, you hear some muffled cursing, followed by moans. Curious, you lean into the one cell with an open door and are treated to the sight of ${S.Wardeness.slaveName} holding ${contextualIntro(S.Wardeness, subSlave, true)}'s head` + `breaks bitches late one night, you hear some muffled cursing, followed by moans. Curious, you lean into the one cell with an open door and are treated to the sight of ${S.Wardeness.slaveName} holding`, + App.UI.DOM.combineNodes(contextualIntro(S.Wardeness, subSlave, "DOM"), `'s head`) ]); App.Events.addParagraph(node, [`${hasBothLegs(S.Wardeness) ? `between ${his} legs` : `at ${his} groin`}, receiving what is very obviously non-consensual oral sex. ${S.Wardeness.slaveName} is clearly enjoying ${himself}, but gathers ${himself} together and greets you properly, without stopping.`]); diff --git a/src/events/PETS/petsComfortingAttendant.js b/src/events/PETS/petsComfortingAttendant.js index 3fef0862df9178dbb91a8c67666887cbef6d8be4..d41aaa8b5bce55d954fa11cec0d51f2194d36fd5 100644 --- a/src/events/PETS/petsComfortingAttendant.js +++ b/src/events/PETS/petsComfortingAttendant.js @@ -34,8 +34,10 @@ App.Events.petsComfortingAttendant = class petsComfortingAttendant extends App.E } r.push( `company is always nice even if you aren't actively using the spa's resting inhabitants. The steam in the warm pool room is turned up very high, and you can hardly see. As you lower yourself into the warm water, you see`, - App.UI.DOM.slaveDescriptionDialog(S.Attendant), - `across from you, sitting in the water against the pool wall. ${He}'s holding ${contextualIntro(S.Attendant, subSlave, true)} in ${his} arms, rubbing a comforting hand up and down ${his2} back and murmuring into ${his2} ear. ${subSlave.slaveName} has ${his2} head`); + contextualIntro(V.PC, S.Attendant, "DOM"), + `across from you, sitting in the water against the pool wall. ${He}'s holding`, + contextualIntro(S.Attendant, subSlave, "DOM"), + `in ${his} arms, rubbing a comforting hand up and down ${his2} back and murmuring into ${his2} ear. ${subSlave.slaveName} has ${his2} head`); if (S.Attendant.boobs > 2000) { r.push(`almost hidden between ${S.Attendant.slaveName}'s massive tits,`); } else if (S.Attendant.boobs > 1000) { @@ -64,7 +66,11 @@ App.Events.petsComfortingAttendant = class petsComfortingAttendant extends App.E } else { r.push(`taut`); } - r.push(`midriff with your arms and giving ${him} a hug before asking ${him} about ${subSlave.slaveName}. In ${S.Attendant.slaveName}'s opinion, there's nothing really wrong with ${him2}: ${he2}'s just having a little trouble accepting different expectations about human interactions. "${He2} just needs a little help accepting that ${he2}'s a slave and it's ${his2} place to serve you, ${Master}," ${he} says. "Like I have!" ${He} wriggles around in your arms and plants a wet kiss on your nose. ${He}'s clean now, so you release ${him} and ${he} steps over to ${his} towel. As ${he} does, you land a wet slap on ${his}`); + r.push(`midriff with your arms and giving ${him} a hug before asking ${him} about ${subSlave.slaveName}. In ${S.Attendant.slaveName}'s opinion, there's nothing really wrong with ${him2}: ${he2}'s just having a little trouble accepting different expectations about human interactions.`, + Spoken(S.Attendant, `"${He2} just needs a little help accepting that ${he2}'s a slave and it's ${his2} place to serve you, ${Master},"`), + `${he} says.`, + Spoken(S.Attendant, `"Like I have!"`), + `${He} wriggles around in your arms and plants a wet kiss on your nose. ${He}'s clean now, so you release ${him} and ${he} steps over to ${his} towel. As ${he} does, you land a wet slap on ${his}`); if (S.Attendant.butt > 5) { r.push(`massive`); } else if (S.Attendant.butt > 3) { @@ -72,7 +78,7 @@ App.Events.petsComfortingAttendant = class petsComfortingAttendant extends App.E } else { r.push(`nice`); } - r.push(`butt, eliciting a <span class="hotpink">delighted</span> squeal. You use the information to <span class="hotpink">subtly address</span> ${subSlave.slaveName}'s unhappiness.`); + r.push(`butt, eliciting a <span class="devotion inc">delighted</span> squeal. You use the information to <span class="devotion inc">subtly address</span> ${subSlave.slaveName}'s unhappiness.`); S.Attendant.devotion += 4; subSlave.devotion += 4; App.Events.addParagraph(frag, r); diff --git a/src/events/RE/reStandardPunishment.js b/src/events/RE/reStandardPunishment.js index 7d8a60f69c2c018b5df59e7750ac8f6941b23bfb..c930e678a8395a35837a39922de81af11aa552e2 100644 --- a/src/events/RE/reStandardPunishment.js +++ b/src/events/RE/reStandardPunishment.js @@ -95,7 +95,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. if (V.HeadGirlID !== 0) { r.push(`${S.HeadGirl.slaveName} is`); if (slave.rules.punishment === "situational") { - r.push(`assessing an appropriate punishment`); + r.push(`assessing an appropriate punishment.`); } else { r.push(`sentencing ${him} to ${his} standard punishment,`); switch (slave.rules.punishment) { @@ -113,7 +113,7 @@ App.Events.REStandardPunishment = class REStandardPunishment extends App.Events. } else { r.push(`${V.assistant.name} is`); if (slave.rules.punishment === "situational") { - r.push(`assessing an appropriate punishment`); + r.push(`assessing an appropriate punishment.`); } else { r.push(`sentencing ${him} to ${his} standard punishment,`); switch (slave.rules.punishment) { @@ -544,7 +544,7 @@ 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`); + r.push(`You tell ${him} that ${he} clearly needs practice being prompt.`); 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 { diff --git a/src/events/RESS/ageDifferenceOldPC.js b/src/events/RESS/ageDifferenceOldPC.js index 871c8c63676216eae4175f800a9fd2857185d8ce..592db14bd747ee3c286057c6a6df28c948d96745 100644 --- a/src/events/RESS/ageDifferenceOldPC.js +++ b/src/events/RESS/ageDifferenceOldPC.js @@ -74,7 +74,6 @@ App.Events.RESSAgeDifferenceOldPC = class RESSAgeDifferenceOldPC extends App.Eve isFertile(eventSlave) ? new App.Events.Result(`Give ${him} an afternoon off for some quality time with a local retirement community`, afternoon, virginityWarning(true)) : new App.Events.Result(), - ]); function virginityWarning(knockedUp){ diff --git a/src/events/RESS/review/badDream.js b/src/events/RESS/review/badDream.js new file mode 100644 index 0000000000000000000000000000000000000000..abbe369e4fdae910245d95ea94d90198a737af21 --- /dev/null +++ b/src/events/RESS/review/badDream.js @@ -0,0 +1,199 @@ +App.Events.RESSBadDream = class RESSBadDream extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + hasAnyLegs, + canTalk, + s => s.assignment !== Job.QUARTER, + s => s.devotion <= 20, + s => s.trust < -20, + s => s.rules.living === "spare", + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + His, He, he, his, him, himself, hers + } = getPronouns(eventSlave); + const belly = bellyAdjective(eventSlave); + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + let r = []; + r.push( + `Passing near the slave dormitory late at night, you hear a quiet cry within. This is strange; most slaves housed there are not inclined or not allowed to have sex in the middle of the night, and in any case, the noise wasn't one of pleasure. Looking in, you see a jerky movement near the door. It's`, + App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, "DOM"), ","), + `and ${he}'s obviously having a bad dream. ${He} raises` + ); + if (hasBothArms(eventSlave)) { + r.push(`an`); + } else { + r.push(`${his}`); + } + r.push(`arm to fend off some imagined danger, and in doing so, pushes the sheet down around ${his} waist. ${He} sleeps naked, like all your slaves, and the movement bares ${his}`); + if (eventSlave.boobs > 2000) { + r.push(`udders`); + } else if (eventSlave.boobs > 1000) { + r.push(`heavy breasts`); + } else if (eventSlave.boobs > 400) { + r.push(`boobs`); + } else { + r.push(`little tits`); + } + if (eventSlave.belly >= 5000) { + r.push(`and ${belly}`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnant`); + } + r.push(`belly`); + } + r.push(`to the cool night air. The low blue light outlines ${his} nipples as they`); + if (eventSlave.nipples !== "fuckable") { + r.push(`stiffen`); + } else { + r.push(`swell`); + } + r.push(`at the sudden change of temperature,`); + switch (eventSlave.nipples) { + case "tiny": + r.push(`pricking up into little buds.`); + break; + case "flat": + r.push(`becoming visible against ${his} areolae.`); + break; + case "puffy": + r.push(`the puffy promontories jutting even farther out.`); + break; + case "partially inverted": + r.push(`just starting to poke past their inversion.`); + break; + case "inverted": + r.push(`the twin domes formed by their inverted shapes becoming more prominent.`); + break; + case "huge": + r.push(`becoming so large they cast long shadows across ${his} bed.`); + break; + case "fuckable": + r.push(`the fuckable holes steadily closing and starting to poke outwards.`); + break; + default: + r.push(`becoming attractively erect.`); + } + r.push(`Still dreaming, ${he} clasps ${his}`); + if (hasBothArms(eventSlave)) { + r.push(`arms`); + } else { + r.push(`arm`); + } + r.push(`protectively over ${his}`); + if (eventSlave.pregKnown === 1) { + r.push(`unborn`); + if (eventSlave.pregType > 1) { + r.push(`children,`); + } else { + r.push(`child,`); + } + } else { + r.push(`vulnerable chest,`); + } + r.push( + `and rolls to one side. Halfway into a fetal position, ${he} turns ${his} head against ${his} pillow, murmuring`, + Spoken(eventSlave, `"N-no — please no — I'll d-do anyth-thing — no..."`) + ); + + App.Events.addParagraph(node, r); + App.Events.addResponses(node, [ + /* TODO: add a positive variant */ + new App.Events.Result(`Let ${him} be`, leave), + new App.Events.Result(`Hug ${him}`, hug), + (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) + ? new App.Events.Result(`Rape ${him}`, rape, ((eventSlave.vagina === 0 && canDoVaginal(eventSlave)) || (eventSlave.anus === 0) && canDoAnal(eventSlave)) ? `This option will take ${his} virginity` : null) + : new App.Events.Result(), + ]); + + function leave() { + return `It may be for the best to not disturb ${his} restless slumber, you decide. Admiring the attractive view for just a moment longer, you turn back and head to your own bed. The next morning, it appears as though ${eventSlave.slaveName} doesn't even remember this nightmare.`; + } + + function hug() { + r = []; + r.push(`You reach out to hug ${him}, but as soon as your hand touches ${his} shoulder, ${he} writhes instinctively away.`); + if (canSee(eventSlave)) { + r.push(`${His} eyes fly open, searching frantically for ${his} assailant. Seeing that it's you, ${he} screams and scrabbles away even harder. After making it a few feet, ${he} collects ${his} wits enough to bring ${himself} to a stop and stop screaming, though ${he} continues to sob, staring at you in terror.`); + } else { + r.push(`${He} gropes frantically for ${his} assailant, before making contact with you. ${He} screams and scrabbles away, only stopping when ${he} collides with the nearest solid object.`); + if (canHear(eventSlave)) { + r.push(`Only after several call outs that it is you does ${he} stop screaming, though ${he} continues to sob, listening to your every breath in terror.`); + } else { + r.push(`After screaming ${himself} hoarse, ${he} realizes that ${his} assault has abruptly ended, and gently feels around ${his} surroundings with a shaking hand to discover ${himself} back in ${his} room.`); + } + } + r.push(`${He} remains frozen in place as you slowly advance on ${him} and give ${him} a light embrace. ${His} tears gradually stop, but ${he} does not relax,`); + if (canSee(eventSlave)) { + r.push(`remaining dumbly stiff`); + } else { + r.push(`continuing to quake in fear`); + } + r.push(`within your arms. Eventually you let ${him} go, and ${he} crawls pathetically back under ${his} sheet, still weeping softly. It seems ${he} is <span class="trust dec">more afraid of you</span> than ever, and if you thought that a simple hug could win ${him} over, you were wrong.`); + if (canSee(eventSlave)) { + eventSlave.trust -= 4; + } else if (canHear(eventSlave)) { + eventSlave.trust -= 5; + } else { + eventSlave.trust -= 6; + } + return r; + } + + function rape() { + const frag = document.createDocumentFragment(); + r = []; + r.push(`You snatch the sheet off ${him}, shove ${his} uppermost shoulder down so ${his} face is smashed into the pillow, and bring your knees down between ${his} legs, spreading them to force ${hers} apart. You use the hand that isn't controlling ${his} torso to locate ${his}`); // TODO add support for one-handed PC? + if (canDoVaginal(eventSlave)) { + if (eventSlave.vagina > 2) { + r.push(`amusingly loose cunt`); + } else if (eventSlave.vagina > 1) { + r.push(`large womanhood`); + } else if (eventSlave.vagina > 0) { + r.push(`tight pussy`); + } else { + r.push(`poor virgin pussy`); + } + } else { + if (eventSlave.anus > 2) { + r.push(`amusingly broad asshole`); + } else if (eventSlave.anus > 1) { + r.push(`big butthole`); + } else if (eventSlave.anus > 0) { + r.push(`tight rosebud`); + } else { + r.push(`poor virgin anus`); + } + } + r.push(`in the dark as ${he} begins to <span class="trust dec">struggle and scream.</span> ${He} comes fully awake when ${he} feels your rough fingers searching for and then finding ${his}`); + if (eventSlave.vagina >= 0 && canDoVaginal(eventSlave)) { + r.push(`vagina,`); + } else { + r.push(`crinkled hole,`); + } + r.push(`and ${his} noise increases to the point where it becomes annoying. You stuff ${his} face into the pillow and take ${him} mercilessly, using the pillow to cut off ${his} breath whenever ${he} struggles too much, until oncoming suffocation forces ${him} to go still and take it like a good little bitch.`); + App.Events.addParagraph(frag, r); + App.Events.addParagraph(frag, [`<span class="devotion dec">Sometimes dreams do come true.</span>`]); + App.Events.addParagraph(frag, [VCheck.Simple(eventSlave, 1)]); + eventSlave.trust -= 4; + eventSlave.devotion -= 4; + return frag; + } + } +}; diff --git a/src/events/RESS/review/cumslutWhore.js b/src/events/RESS/review/cumslutWhore.js new file mode 100644 index 0000000000000000000000000000000000000000..052ef4596721df79ba8cb9ce9c356b0130273ea4 --- /dev/null +++ b/src/events/RESS/review/cumslutWhore.js @@ -0,0 +1,180 @@ +App.Events.RESSCumslutWhore = class RESSCumslutWhore extends App.Events.BaseEvent { + eventPrerequisites() { + return [ + () => V.PC.dick !== 0, + ]; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + s => s.devotion > 20, + s => s.fetishKnown === 1, + s => [Job.PUBLIC, Job.WHORE, Job.GLORYHOLE].includes(s.assignment), + s => s.fetish === "cumslut" || s.energy > 95, // Add condition !== "hates oral" ? + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, girl, hers + } = getPronouns(eventSlave); + const {title: Master, say} = getEnunciation(eventSlave); + const belly = bellyAdjective(eventSlave); + const hands = hasBothArms(eventSlave) ? "hands" : "hand"; + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + let r = []; + r.push( + `Late at night,`, + contextualIntro(V.PC, eventSlave, "DOM"), + `returns to the living area of the penthouse. It's the end of ${his} day as a working girl, and despite being obviously tired, ${he}'s smiling with obvious sexual satiation. Every so often, ${he}'ll get a dreamy expression and lick ${his} lips. ${He} fetishizes cum to the extent that getting to eat a` + ); + if (V.showInches === 2) { + r.push(`mile`); + } else { + r.push(`kilometer`); + } + r.push(`of dick really satisfies ${him}.`); + + App.Events.addParagraph(node, r); + App.Events.addResponses(node, [ + new App.Events.Result(`${He} must have at least a little room left`, room), + new App.Events.Result(`Cum in ${his} mouth all night`, night), + cumSlaves().length >= 5 + ? new App.Events.Result(`Give ${him} access to the Dairy's cockmilk`, cockmilk) + : new App.Events.Result() + ]); + + function room() { + r = []; + r.push(`You call ${eventSlave.slaveName} in and ask how full ${he} is. ${He} looks confused for a moment but soon figures out what you mean.`); + if (!canTalk(eventSlave) && (!hasAnyArms(eventSlave))) { + r.push(`As a mute amputee ${he} communicates poorly,`); + if (eventSlave.inflationType === "cum") { + if (eventSlave.bellyFluid >= 10000) { + r.push(`but ${he} sticks out ${his} hugely bloated cum-belly and opens wide, ${his} intent clear.`); + } else if (eventSlave.bellyFluid >= 5000) { + r.push(`but ${he} wiggles around so ${his} cum-filled belly sloshes audibly before opening wide.`); + } else { + r.push(`but ${he} sticks out ${his} cum-swollen belly and opens wide, ${his} intent clear.`); + } + } else { + r.push(`but ${he} does manage to look hungry.`); + } + } else if (!canTalk(eventSlave)) { + if (eventSlave.inflationType === "cum") { + if (eventSlave.bellyFluid >= 10000) { + r.push(`${He} strokes ${his} hugely bloated cum-belly, makes a sign for "never," and then makes a sign for "enough."`); + } else if (eventSlave.bellyFluid >= 5000) { + r.push(`${He} jiggles ${his} cum-filled belly lewdly, makes a sign for "need," and then makes a sign for "more."`); + } else { + r.push(`${He} pats ${his} cum-swollen belly, makes a sign for "much," and then makes a sign for "room."`); + } + } else { + r.push(`${He} gestures at ${his}`); + if (eventSlave.belly >= 1500) { + r.push(belly); + } + r.push(`stomach, makes a sign for "full," and then makes a sign for "never."`); + } + } else { + if (eventSlave.inflationType === "cum") { + if (eventSlave.bellyFluid >= 10000) { + r.push( + `${He} strokes ${his} hugely bloated cum-belly,`, + Spoken(eventSlave, `"Oh ${Master}, I've had so much cum already today, but I can't help myself if you're offering me even more. I'll find some room in there,"`) + ); + } else if (eventSlave.bellyFluid >= 5000) { + r.push( + `${He} jiggles ${his} cum-filled belly lewdly,`, + Spoken(eventSlave, `"Oh ${Master}, there's so much already in me, but I feel so empty still."`) + ); + } else { + r.push( + `${He} pats ${his} cum-swollen stomach,`, + Spoken(eventSlave, `"Oh ${Master}, this little belly is nothing, I always have room for more,"`) + ); + } + } else { + r.push(Spoken(eventSlave, `"Oh ${Master}, I'll never be full again,"`)); + } + r.push(`${he} ${say}s`); + if (eventSlave.lips > 70) { + r.push(`past ${his} enormous lips`); + } else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) { + r.push(`past ${his} mouthful of piercings`); + } + r.push(r.pop() + `.`); + } + r.push(`${He} comes eagerly over and sucks you off with enthusiasm. As you cum, ${he} orgasms quickly at the`); + if (canTaste(eventSlave)) { + r.push(`taste`); + } else { + r.push(`feeling`); + } + r.push(`of the stuff hitting ${his}`); + if (V.PC.balls >= 10) { + r.push(`mouth, even as your load keeps flowing into ${his} gullet`); + if (V.PC.balls >= 30) { + r.push(`steadily bloated the poor ${girl}`); + } + } else { + r.push(`mouth.`); + } + if (!canTalk(eventSlave)) { + r.push(`${He}`); + if (!canTaste(eventSlave)) { + r.push(`(rather ironically)`); + } + r.push(`signs that you taste great.`); + } else { + r.push( + Spoken(eventSlave, `"${Master}, you taste great,"`), + `${he}` + ); + if (!canTaste(eventSlave)) { + r.push(`(rather ironically)`); + } + r.push(`purrs.`); + } + r.push(`<span class="trust inc">${He} has become more trusting</span> in your willingness to give ${him} what ${he} wants.`); + eventSlave.trust += 4; + seX(eventSlave, "oral", V.PC, "penetrative"); + return r; + } + + function night() { + r = []; + r.push(`You've had a busy day, so you've been unusually remiss in fucking your slaves. Naturally, this means you'll be spending the evening wandering around your home using your living sexual appliances. ${eventSlave.slaveName} is instructed to follow you and assist. ${He}'s tired, so`); + if (!hasAnyArms(eventSlave)) { + r.push(`you bring`); + if (isAmputee(eventSlave)) { + r.push(`${his} limbless torso`); + } else { + r.push(`${him}`); + } + r.push(`along as a cum receptacle. Whenever you're about to finish in another slave, you pull out and fill ${his} mouth instead.`); + } else { + r.push(`you let ${him} tag meekly along, masturbating gently as you use other slaves or just watching lazily. But whenever you're on the point of coming, you switch to ${his} mouth and let ${him} finish you with a few sucks and pumps of ${his} fatigued ${hands}.`); + } + r.push(`By the time you put the exhausted ${eventSlave.slaveName} to bed ${he}'s in a haze of cum-induced pleasure. <span class="devotion inc">${He} has become more submissive to you.</span>`); + eventSlave.devotion += 4; + seX(eventSlave, "oral", V.PC, "penetrative", 5); + return r; + } + + function cockmilk() { + eventSlave.devotion += 10; + cashX(random(500, 1000), "event", eventSlave); + return `You let ${him} know you have a sexual accessory for ${him} to use. This isn't too unusual, so ${he} comes to your office without much anticipation. ${He} doesn't understand why you have an enormous sealed canister of fresh cum on your desk, but when you explain that it's ${hers} to play with on the job, ${he} starts to bounce with excitement. Not all of ${his} customers are interested in cum play, but quite a few are, and ${he} spends almost as much time cleaning up the gorgeous messes that get made as ${he} does making them. It's a valuable and <span class="cash inc">profitable</span> whore who <span class="devotion inc">looks forward</span> to ${his} next customer.`; + } + } +}; diff --git a/src/events/RESS/review/desperatelyHorny.js b/src/events/RESS/review/desperatelyHorny.js new file mode 100644 index 0000000000000000000000000000000000000000..e2a745f229e01c975a3b9599651ba4564b5629bb --- /dev/null +++ b/src/events/RESS/review/desperatelyHorny.js @@ -0,0 +1,1006 @@ +App.Events.RESSDesperatelyHorny = class RESSDesperatelyHorny extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + hasAnyLegs, + s => s.rules.release.masturbation === 0, + s => !App.Utils.hasNonassignmentSex(s), + s => s.need, + s => s.devotion >= -20, + s => s.trust >= -50, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + His, He, he, his, him, himself, girl, hers + } = getPronouns(eventSlave); + const {title: Master} = getEnunciation(eventSlave); + const belly = bellyAdjective(eventSlave); + const PC = V.PC; + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + let r = []; + r.push( + `Looking deeply unhappy and shivering occasionally,`, + contextualIntro(PC, eventSlave, "DOM"), + `comes to see you.` + ); + if (eventSlave.rules.speech === "restrictive") { + r.push(`Since ${he} is not allowed to speak, ${he} just enters your office and stands there, unsure what to do.`); + } else { + if (!canTalk(eventSlave)) { + r.push(`${He} tries to communicate something with ${his}`); + if (hasBothArms(eventSlave)) { + r.push(`hands,`); + } else { + r.push(`hand,`); + } + r.push(`but ${he}'s so distracted ${he} can't manage it. ${He} starts to shake a little and gives up.`); + } else { + r.push( + Spoken(eventSlave, `"${Master}, please! Please — I — please, I need to — oh, ${Master}—"`), + he + ); + if (SlaveStatsChecker.checkForLisp(eventSlave)) { + r.push(`lisps frantically.`); + } else { + r.push(`babbles.`); + } + r.push(`${He} starts to shake a little and lapses into silence.`); + } + } + r.push(`The reason for ${his} distress is obvious:`); + if (eventSlave.chastityPenis === 1) { + r.push(`${his} chastity cage is mostly solid, but it has a small hole below where the tip of ${his} dick is held, and this is dripping precum. ${He}'s sexually helpless, and sexually overcharged to the point where ${he}'s dripping more precum than a usual dickgirl might ejaculate normally.`); + } else if (eventSlave.dick > 0 && eventSlave.hormoneBalance >= 100 && !canAchieveErection(eventSlave)) { + r.push(`though the hormones are keeping it soft, ${his} member is dripping a stream of precum; droplets of the stuff spatter ${his} legs. One of ${his} spasms brings ${his} dickhead brushing against ${his} thigh, and the stimulation almost brings ${him} to orgasm.`); + } else if (eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.ballType === "sterile" && !canAchieveErection(eventSlave)) { + r.push(`though ${he}'s chemically castrated, ${his} soft member is dripping a stream of watery precum; droplets of the stuff spatter ${his} legs. One of ${his} spasms brings ${his} dickhead brushing against ${his} thigh, and the stimulation almost brings ${him} to orgasm.`); + } else if (eventSlave.dick > 0 && eventSlave.balls === 0 && !canAchieveErection(eventSlave)) { + r.push(`though ${he}'s gelded, ${his} soft member is dripping a stream of watery precum; droplets of the stuff spatter ${his} legs. One of ${his} spasms brings ${his} dickhead brushing against ${his} thigh, and the stimulation almost brings ${him} to orgasm.`); + } else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) { + r.push(`though ${he}'s far too large to get hard, ${his} engorged member is dripping a stream of watery precum; droplets of the stuff spatter the floor. One of ${his} spasms brushes the length of ${his} cock against ${his} thigh, and the stimulation almost brings ${him} to orgasm.`); + } else if (eventSlave.dick > 0) { + if (eventSlave.dick > 4) { + r.push(`${his} gigantic member juts out painfully, scattering droplets of precum whenever ${he} moves. One of ${his} spasms brings ${his} dickhead brushing up against ${his}`); + } else if (eventSlave.dick > 2) { + r.push(`${his} impressive member juts out painfully, scattering droplets of precum whenever ${he} moves. One of ${his} spasms brings ${his} dickhead brushing up against ${his}`); + } else { + r.push(`${his} little member juts out painfully, scattering droplets of precum whenever ${he} moves. One of ${his} spasms brings ${his} dickhead brushing up against ${his}`); + } + if (eventSlave.belly >= 10000 || eventSlave.weight > 95) { + r.push(belly); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnancy,`); + } else { + r.push(`belly,`); + } + } else { + r.push(`abdomen,`); + } + r.push(`and the stimulation almost brings ${him} to orgasm.`); + } else if (eventSlave.chastityVagina) { + r.push(`female juices are leaking out from behind ${his} chastity belt. ${His} cunt desperately wants to be fucked, and is dripping natural lubricant to ease penetration by cocks that cannot reach it through its protective shield.`); + } else if (eventSlave.clit > 3) { + r.push(`${his} dick-like clit is painfully engorged and juts out massively. The stimulation of the air on ${his} clit keeps ${him} on the brink of orgasm.`); + } else if (eventSlave.clit > 0) { + r.push(`${his} lovely clit is painfully engorged, and ${his} pussy is so wet there are little rivulets of moisture running down ${his} inner thighs. One of ${his} spasms brings ${his} clit brushing accidentally against ${his} hand, and the stimulation almost brings ${him} to orgasm.`); + } else if (eventSlave.labia > 0) { + r.push(`${his} lovely pussylips are painfully engorged, and ${his} pussy is so wet there are little rivulets of moisture running down ${his} inner thighs. One of ${his} spasms brings ${his} generous labia brushing against ${his} thighs, and the stimulation almost brings ${him} to orgasm.`); + } else if (eventSlave.vagina === -1) { + r.push(`though ${he} has no external genitalia to display it, ${he}'s flushed and uncomfortable, and is unconsciously presenting ${his} ass, since that's ${his} only real avenue to climax.`); + } else { + r.push(`${his} pussy is so wet there are little rivulets of moisture running down ${his} inner thighs. One of ${his} spasms brings ${him} enough stimulation that it almost brings ${him} to orgasm.`); + } + App.Events.addParagraph(node, r); + App.Events.addParagraph(node, [`This is the result of not getting off for several days while on the slave diet provided by the nutritional systems. The mild aphrodisiacs included in ${his} food increase ${his} sex drive, and the increased libido can become cumulative if it's not regularly addressed. It looks like ${he} hasn't really gotten ${hers} in a couple of days, and the poor ${girl} can likely think of nothing but that. ${He}'s so horny ${he}'ll do anything for release. However, ${he} did come to you with ${his} trouble rather than masturbating illicitly.`]); + + let choices = [new App.Events.Result(`Touch ${him} enough to get ${him} off`, touch)]; + if (eventSlave.fetishKnown === 1 && eventSlave.fetish !== "none") { + choices.push(new App.Events.Result(`Reward ${him} for coming to you`, reward, virginityWarning())); + } + choices.push(new App.Events.Result(null, null, `Let ${him} get off:`)); + const unknownWeakFetish = (eventSlave.fetishKnown !== 1 || eventSlave.fetishStrength <= 95); + if (eventSlave.fetish !== "cumslut" || unknownWeakFetish) { + choices.push(new App.Events.Result(`while ${he} sucks`, sucks)); + } + if (eventSlave.fetish !== "boobs" || unknownWeakFetish) { + choices.push(new App.Events.Result(`during nipple play`, nipple)); + } + if ((eventSlave.fetish !== "pregnancy" || unknownWeakFetish) && canDoVaginal(eventSlave)) { + choices.push(new App.Events.Result(`during insemination play`, insemination, eventSlave.vagina === 0 ? `This option will take ${his} virginity` : null)); + } + if ((eventSlave.fetish !== "buttslut" || unknownWeakFetish) && canDoAnal(eventSlave)) { + choices.push(new App.Events.Result(`while ${he} takes it up the ass`, ass, eventSlave.anus === 0 ? `This option will take ${his} anal virginity` : null)); + } + if (eventSlave.fetish !== "humiliation" || unknownWeakFetish) { + choices.push(new App.Events.Result(`in public`, inPublic)); + } + if (eventSlave.fetish !== "submissive" || unknownWeakFetish) { + choices.push(new App.Events.Result(`after submitting to you`, submitting, virginityWarning())); + } + if (eventSlave.fetish !== "masochist" || unknownWeakFetish) { + choices.push(new App.Events.Result(`while in pain`, pain, virginityWarning())); + } + App.Events.addResponses(node, choices); + + function touch() { + r = []; + r.push(`You tell ${him} that ${he} deserves a reward for coming to you. ${He} almost bursts into tears and nods jerkily, unable to do anything else. You brush a finger across ${his} cheek, ${his} ear, ${his} lips; at each touch ${he}`); + if (!canTalk(eventSlave)) { + r.push(`breathes in sharply.`); + } else { + r.push(`gasps.`); + } + r.push(`Moving around behind ${him}, you run a hand down ${his} flank to ${his} hip, and then around to ${his}`); + if (eventSlave.belly >= 10000 || eventSlave.bellyPreg >= 5000) { + r.push(`popped`); + } + r.push(`navel, and up to cup ${his} breasts. Your run a thumb`); + if (eventSlave.nipples !== "fuckable") { + r.push(`over`); + } else { + r.push(`into`); + } + r.push(`each nipple, almost tipping ${him} over the edge. Your hands move down again,`); + if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) { + r.push(`spreading ${his} buttocks to tease ${his} clenched anus, and then forward across ${his} perineum. From there, you trace ${his} labia and end with a pinch of ${his} clit — and this is enough.`); + } else if (canDoAnal(eventSlave)) { + r.push(`spreading ${his} buttocks to tease ${his} clenched anus, and then forward across ${his} perineum — and this is enough.`); + } else if (canDoVaginal(eventSlave)) { + r.push(`tracing ${his} labia, and then forward to ${his} clit — and this is enough.`); + } else { + r.push(`to give ${his} buttcheeks a rub down before teasing at ${his} chastity — and this is enough.`); + } + r.push(`${He} spasms, pitching forward`); + if (eventSlave.belly >= 300000) { + r.push(`onto ${his} obscene belly.`); + } else { + r.push(`and almost falling.`); + } + r.push(`${He} hurries to clean up after ${himself}, sobbing with relief and thanking you; ${his} submissiveness <span class="devotion inc">has increased.</span>`); + eventSlave.devotion += 4; + return r; + } + + function reward() { + const {heU, hisU, himU, girlU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U"); + const child = eventSlave.pregType > 1 ? "children" : "child"; + r = []; + r.push(`${He} almost cries with relief when you tell ${him} to`); + switch (eventSlave.fetish) { + case "submissive": + r.push(`lie down on your desk on ${his} side in the fetal position. ${He} clambers up hurriedly and hugs ${his} knees`); + if (eventSlave.belly >= 10000) { + r.push(`as best ${he} can with ${his} ${belly}`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnancy`); + } + r.push(`in the way`); + } + r.push(r.pop() + `, spinning ${himself} around on the smooth surface so ${his} rear is pointing right at you. You stand up and pull ${him} over, ${his} ${eventSlave.skin} skin sliding across the cool glass desktop, until ${his}`); + if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) { + r.push(`butt is right at the edge of the desk. You warm yourself up with a pussy fuck before shifting your attention to ${his} neglected asshole.`); + r.push(VCheck.Both(eventSlave, 3)); + r.push(`When you finish, you`); + } else if (canDoAnal(eventSlave)) { + r.push(`butt is right at the edge of the desk.`); + r.push(VCheck.Anal(eventSlave, 3)); + r.push(`You give it a good fuck and then`); + } else if (canDoVaginal(eventSlave)) { + r.push(`pussy is right at the edge of the desk.`); + r.push(VCheck.Vaginal(eventSlave, 3)); + r.push(`You give it a good fuck and then`); + } else { + r.push(`mouth is right at the edge of the desk. You give it a good fuck and then`); + seX(eventSlave, "oral", PC, "penetrative", 3); + } + r.push(`order ${him} brusquely to clean up and come right back. You use ${him} as a nice little desktop`); + if (PC.dick !== 0) { + r.push(`cockholster`); + } else { + r.push(`sex toy`); + } + r.push(`for the rest of the day.`); + break; + case "cumslut": + r.push(`get under your desk and`); + if (PC.dick !== 0) { + r.push(`suck a dick`); + if (PC.vagina !== -1) { + r.push(`and eat a pussy`); + } + } else { + r.push(`eat pussy`); + } + r.push(`while you work.`); + if (eventSlave.belly >= 120000) { + r.push(`As ${his} ${belly} belly bumps into you, you sigh and swivel your chair to the side; there is no way ${he}'ll fit under there in ${his} bloated state.`); + } + r.push(`${He}'s so horny that ${he}'s barely got`); + if (PC.dick !== 0) { + r.push(`your cock into ${his} mouth`); + } else { + r.push(`${his} lips and tongue on your cunt`); + } + r.push(`before ${he} climaxes spontaneously, shivering and moaning nicely. You keep ${him} down there for a while, doing light work and orgasming occasionally as ${he} gently`); + if (PC.dick !== 0) { + r.push(`blows you`); + if (PC.vagina !== -1) { + r.push(`and eats you out`); + } + } else { + r.push(`lavishes attention on your wet vagina`); + } + r.push(r.pop() + `.`); + seX(eventSlave, "oral", PC, "penetrative", 3); + break; + case "humiliation": + r.push(`run an unimportant message to a citizen across ${V.arcologies[0].name}. Naked. ${He} blushes with mixed embarrassment and anticipation. ${He}'s so pent up that before taking ten steps out of your penthouse entryway and towards ${his} objective, the open stares ${his} naked, horny body is getting push ${him} over the edge.`); + if (eventSlave.chastityPenis === 1) { + r.push(`As ${he}`); + if (eventSlave.belly >= 10000) { + r.push(`waddles`); + } else { + r.push(`walks`); + } + r.push(`along, ${his} chastity cage continues to stream precum. It spatters ${his} legs, making ${his} desperation completely obvious to anyone who looks at ${him}`); + if (eventSlave.belly >= 150000) { + r.push(`from behind`); + } + r.push(r.pop() + `.`); + } else if (canAchieveErection(eventSlave)) { + r.push(`${His} rock hard cock,`); + if (eventSlave.belly >= 150000) { + r.push(`forced down by the size of ${his} ${belly}`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnancy`); + } else { + r.push(`stomach`); + } + r.push(`as ${he}`); + if (eventSlave.belly >= 10000) { + r.push(`waddles`); + } else { + r.push(`walks`); + } + r.push(`hurriedly along, jerks suddenly and shoots out a little squirt of cum down the underside of ${his} belly.`); + } else { + r.push(`sticking straight forward as ${he}`); + if (eventSlave.belly >= 10000) { + r.push(`waddles`); + } else { + r.push(`walks`); + } + r.push(`hurriedly along, jerks suddenly upward and shoots out a little squirt of cum`); + if (eventSlave.belly >= 10000) { + r.push(`across the underside of ${his}`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnant`); + } + r.push(`belly`); + } + r.push(r.pop() + `.`); + } + r.push(`As ${he} stumbles forward, each step releases another squirt.`); + } else if (eventSlave.dick > 0) { + r.push(His); + if (eventSlave.dick > 6) { + r.push(`enormous`); + } + r.push(`soft cock, flopping around as ${he}`); + if (eventSlave.belly >= 10000) { + r.push(`waddles`); + } else { + r.push(`walks`); + } + r.push(`hurriedly along, starts to twitch weakly and release little dribbles of cum. As ${he} stumbles forward, each step releases another squirt.`); + } else if (eventSlave.anus > 2) { + r.push(`As ${he} stumbles a little with the orgasm, ${his}`); + if (canDoAnal(eventSlave)) { + r.push(`naked anus is easily visible from behind ${him}, and its lewd spasms attract attention.`); + } else { + r.push(`anus lewdly spasms under ${his} chastity, and ${his} odd motions attract attention.`); + } + } else if (canDoVaginal(eventSlave)) { + r.push(`${He} focuses ${his} attention on ${his} pussy, awkwardly stumbling along as ${he} tries to walk and finger ${himself} at the same time.`); + } else if (canDoAnal(eventSlave)) { + r.push(`${He} focuses ${his} attention on ${his} asspussy, awkwardly stumbling along as ${he} tries to walk and play with ${his} own butt at the same time.`); + } else if (eventSlave.vagina > 0) { + r.push(`${He} squirts a little femcum down ${his} inner thighs as ${he} stumbles along, trailing the odor of a woman's pleasure behind ${him}.`); + } else { + r.push(`${He} focuses ${his} attention on ${his} breasts, awkwardly stumbling along as ${he} tries to walk and`); + if (eventSlave.nipples !== "fuckable") { + r.push(`tweak`); + } else { + r.push(`finger`); + } + r.push(`${his} own nipples at the same time.`); + } + r.push(`Passersby point and laugh, thrilling ${him}.`); + break; + case "buttslut": + r.push(`sit on your lap.`); + if (canDoAnal(eventSlave)) { + r.push(`${He} climaxes the instant your`); + if (PC.dick !== 0) { + r.push(`dickhead`); + } else { + r.push(`strap-on`); + } + r.push(`touches ${his}`); + if (eventSlave.anus > 2) { + r.push(`anal gape,`); + } else { + r.push(`pucker,`); + } + r.push(`but ${he} knows this is just the start, and ${he} laughs with pleasure as ${his}`); + if (eventSlave.anus > 2) { + r.push(`lewd sphincter loosely squeezes`); + } else { + r.push(`sphincter tightens against`); + } + r.push(`the base of`); + if (PC.dick !== 0) { + r.push(`your cock.`); + } else { + r.push(`the strap-on.`); + } + r.push(`You`); + if (eventSlave.belly >= 5000) { + r.push(`spread your legs more and shove the`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnant,`); + } + r.push(`giggling buttslut down so ${his} ${belly} belly and chest are between your legs, lower your chair a little, and slide yourself back towards your desk to work.`); + } else { + r.push(`shove the giggling buttslut down so ${his} chest is resting against the tops of your legs, lower your chair a little, and slide yourself back towards your desk to work.`); + } + r.push(`${He} wraps ${his} legs around the back of the chair and hugs your knees with ${his} arms, securing ${himself}`); + if (eventSlave.belly >= 100000) { + r.push(`to you as an anal cocksleeve for as long as you feel like keeping`); + if (PC.dick !== 0) { + r.push(`your penis lodged up a compliant butthole.`); + } else { + r.push(`the happy buttslut nice and full.`); + } + } else { + r.push(`under the desk as an anal cocksleeve for as long as you feel like keeping`); + if (PC.dick !== 0) { + r.push(`your penis lodged up a compliant butthole.`); + } else { + r.push(`the happy buttslut trapped under there.`); + } + } + r.push(VCheck.Anal(eventSlave, 1)); + } else { + r.push(`${He} climaxes the instant your`); + if (PC.dick !== 0) { + r.push(`dickhead`); + } else { + r.push(`strap-on`); + } + r.push(`squeezes between ${his}`); + if (eventSlave.butt < 2) { + r.push(`flat, tight cheeks,`); + } else if (eventSlave.butt <= 2) { + r.push(`cute cheeks,`); + } else if (eventSlave.butt <= 3) { + r.push(`round, firm cheeks,`); + } else if (eventSlave.butt <= 4) { + r.push(`curvy, enticing buttcheeks,`); + } else if (eventSlave.butt <= 5) { + r.push(`huge cheeks,`); + } else if (eventSlave.butt <= 6) { + r.push(`massive, alluring cheeks,`); + } else if (eventSlave.butt <= 7) { + r.push(`enormous cheeks,`); + } else if (eventSlave.butt <= 10) { + r.push(`gigantic, jiggly cheeks,`); + } else if (eventSlave.butt <= 14) { + r.push(`inhuman, cushiony butt cheeks,`); + } else if (eventSlave.butt <= 20) { + r.push(`couch-like, super jiggly ass cheeks,`); + } + r.push(`but ${he} knows this is just the start, and ${he} laughs with pleasure as hug ${his} rear around`); + if (PC.dick !== 0) { + r.push(`your cock.`); + } else { + r.push(`the strap-on.`); + } + r.push(`You`); + if (eventSlave.belly >= 5000) { + r.push(`spread your legs more and shove the`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnant,`); + } + r.push(`giggling buttslut down so ${his} ${belly} belly and chest are between your legs, lower your chair a little, and slide yourself back towards your desk to work.`); + } else { + r.push(`shove the giggling buttslut down so ${his} chest is resting against the tops of your legs, lower your chair a little, and slide yourself back towards your desk to work.`); + } + r.push(`${He} wraps ${his} legs around the back of the chair and hugs your knees with ${his} arms, securing ${himself}`); + if (eventSlave.belly >= 100000) { + r.push(`to you as an a cockbun for as long as you feel like keeping`); + if (PC.dick !== 0) { + r.push(`your penis wrapped in a happy buttslut.`); + } else { + r.push(`the happy buttslut entertained.`); + } + } else { + r.push(`under the desk as a cockbun for as long as you feel like keeping the happy buttslut trapped under there.`); + } + r.push(`under the desk as cockbun for as long as you feel like keeping the happy buttslut trapped under there.`); + } + break; + case "boobs": + r.push(`lie atop your desk. You don't bother specifying that ${he}'s to lie on ${his} back, since the boob slut jumps up and presents ${his} tits without instructions. You keep working with one hand while you idly tease and`); + if (eventSlave.nipples !== "fuckable") { + r.push(`flick`); + } else { + r.push(`finger`); + } + r.push(`the nearest`); + if (eventSlave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipple with the other. ${He}'s so horny that ${he} immediately experiences an immodest orgasm, ${his} back arching away from the cool glass desktop as ${he} rides its waves. ${He} giggles a little, and then gasps as you resume playing with ${him}.`); + seX(eventSlave, "mammary", PC, "penetrative"); + if (eventSlave.lactation > 0) { + eventSlave.lactationDuration = 2; + eventSlave.boobs -= eventSlave.boobsMilk; + eventSlave.boobsMilk = 0; + } else { + r.push(induceLactation(eventSlave, 4)); + } + break; + case "pregnancy": + if (!canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) { + r.push(`join you on the couch. Since`); + if (eventSlave.vagina >= 0) { + r.push(`you're saving ${his} pussy,`); + } else { + r.push(`this slave ${girl} doesn't have a pussy,`); + } + r.push(`and ${his} tight little rosebud is off limits, your options are a bit limited. But you work with what you have, playing with ${his}`); + if (isFertile(eventSlave)) { + if (eventSlave.lactation === 0) { + r.push(`nipples and describing in whispers how pregnancy would make them drip with cream.`); + } else { + r.push(`breasts and describing in whispers how big they'll swell if ${he} got pregnant.`); + } + } else if (eventSlave.preg > eventSlave.pregData.normalBirth/2) { + if (eventSlave.lactation === 1) { + r.push(`nipples and describing in whispers how nice and swollen ${he} is with milk.`); + } else { + r.push(`breasts and describing in whispers how big ${he}'s gotten since ${he} got pregnant.`); + } + } else if (eventSlave.preg > 0) { + if (eventSlave.lactation === 0) { + r.push(`nipples and describing in whispers how ${his} pregnancy will soon have them drip with cream.`); + } else { + r.push(`breasts and describing in whispers how ${his} pregnancy will soon swell them to feed ${his} ${child}.`); + } + } else { + if (eventSlave.lactation === 0) { + r.push(`nipples and describing in whispers how they'd drip with cream if only ${he} could get pregnant.`); + } else { + r.push(`breasts and describing in whispers how big they'd swell if only ${he} could get pregnant.`); + } + } + r.push(`${He} gasps and shudders against you.`); + seX(eventSlave, "mammary", PC, "penetrative"); + } else if (eventSlave.anus === 0 && eventSlave.vagina <= 0) { + r.push(`join you on the couch. Since`); + if (eventSlave.vagina === 0) { + r.push(`${he}'s a virgin and you haven't elected to introduce ${him} to pussyfucking just yet,`); + } else { + r.push(`this slave ${girl} doesn't have a pussy,`); + } + r.push(`and ${his} tight little rosebud is fresh and unspoiled, your options are a bit limited. But you work with what you have, playing with ${his}`); + if (isFertile(eventSlave)) { + if (eventSlave.lactation === 0) { + r.push(`nipples and describing in whispers how pregnancy would make them drip with cream.`); + } else { + r.push(`breasts and describing in whispers how big they'll swell if ${he} got pregnant.`); + } + } else if (eventSlave.preg > eventSlave.pregData.normalBirth/2) { + if (eventSlave.lactation === 1) { + r.push(`nipples and describing in whispers how nice and swollen ${he} is with milk.`); + } else { + r.push(`breasts and describing in whispers how big ${he}'s gotten since ${he} got pregnant.`); + } + } else if (eventSlave.preg > 0) { + if (eventSlave.lactation === 0) { + r.push(`nipples and describing in whispers how ${his} pregnancy will soon have them drip with cream.`); + } else { + r.push(`breasts and describing in whispers how ${his} pregnancy will soon swell them to feed ${his} ${child}.`); + } + } else { + if (eventSlave.lactation === 0) { + r.push(`nipples and describing in whispers how they'd drip with cream if only ${he} could get pregnant.`); + } else { + r.push(`breasts and describing in whispers how big they'd swell if only ${he} could get pregnant.`); + } + } + r.push(`${He} gasps and shudders against you.`); + seX(eventSlave, "mammary", PC, "penetrative"); + } else if (eventSlave.pregKnown === 1) { + r.push(`join you on the couch.`); + if (PC.dick !== 0) { + r.push(`You orgasm inside ${him} promptly, and then tell ${him} you'll be leaving your seed inside ${him} to do its work while you have ${him} again.`); + } else { + r.push(`You use a strap-on with a fluid reservoir, and you trigger it promptly, releasing a gush of warm fluid into ${him}. You tell ${him} you'll be leaving it inside ${him} to do its work while you have ${him} again.`); + } + r.push(`${He} gasps at the appeal of the idea and grinds ${himself} against you hungrily.`); + if (!canDoVaginal(eventSlave)) { + if (eventSlave.mpreg === 1) { + r.push(`${He}'s already pregnant, but that doesn't disrupt ${his} fantasy of being even more pregnant.`); + } else { + r.push(`It's ${his} butt you're fucking, but that doesn't disrupt ${his} fantasy.`); + } + r.push(VCheck.Anal(eventSlave, 1)); + } else { + r.push(`${He}'s already pregnant, but that doesn't disrupt ${his} fantasy of being even more pregnant.`); + r.push(VCheck.Vaginal(eventSlave, 1)); + } + } else { + r.push(`join you on the couch.`); + if (PC.dick !== 0) { + r.push(`You orgasm inside ${him} promptly, and then tell ${him} you'll be leaving your seed inside ${him} to do its work while you have ${him} again.`); + } else { + r.push(`You use a strap-on with a fluid reservoir, and you trigger it promptly, releasing a gush of warm fluid into ${him}. You tell ${him} you'll be leaving it inside ${him} to do its work while you have ${him} again.`); + } + r.push(`${He} gasps at the appeal of the idea and grinds ${himself} against you hungrily.`); + if (!canDoVaginal(eventSlave)) { + if (eventSlave.mpreg === 1) { + r.push(`${He}'s eager to get pregnant and intends to put ${his} asspussy to use.`); + } else { + r.push(`It's ${his} butt you're fucking, but that doesn't disrupt ${his} fantasy.`); + } + r.push(VCheck.Anal(eventSlave, 1)); + } else { + r.push(`${He}'s eager to get pregnant and intends to put ${his} pussy to use.`); + r.push(VCheck.Vaginal(eventSlave, 1)); + } + } + break; + case "dom": + r.push(`wait a moment, because you know what ${he} needs. ${He}'s mystified, but steels ${himself} and waits. Another slave appears for an inspection, and ${heU} discovers that ${heU}'s to be inspected with ${eventSlave.slaveName}'s`); + if (canPenetrate(eventSlave)) { + r.push(`cock up ${hisU} asshole.`); + } else { + r.push(`fingers assfucking ${himU}.`); + } + r.push(`The dominant ${eventSlave.slaveName} climaxes immediately to ${his} use of the poor slave, rubbing`); + if (eventSlave.belly >= 5000) { + r.push(`${his} ${belly}`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnant`); + } + r.push(`belly`); + } else { + r.push(`${himself}`); + } + r.push(`all over the other slave's buttocks while ${he} continues banging ${hisU} backdoor.`); + seX(eventSlave, "penetrative", "slaves", "anal"); + break; + case "sadist": + r.push(`wait a moment, because you know what ${he} needs. ${He}'s mystified, but steels ${himself} and waits. Another slave appears for a trivial punishment, and ${heU} discovers that ${heU}'s to be punished by ${eventSlave.slaveName}'s`); + if (canPenetrate(eventSlave)) { + r.push(`dick,`); + } else { + r.push(`fingers,`); + } + r.push(`forced up ${hisU} anus. The dominant ${eventSlave.slaveName} climaxes quickly, but quickly recovers and keeps assraping the poor ${girlU}.`); + seX(eventSlave, "penetrative", "slaves", "anal"); + break; + case "masochist": + r.push(`get ${his} ass up on your desk and`); + if (eventSlave.belly >= 300000) { + r.push(`lie off the side atop ${his} ${belly} stomach.`); + } else if (eventSlave.belly < 1500) { + r.push(`lie on ${his} side.`); + } else { + r.push(`lie face-down.`); + } + r.push(`${He}`); + if (eventSlave.belly >= 10000) { + r.push(`struggles to heft ${his}`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`gravid`); + } + r.push(`body`); + } else { + r.push(`clambers`); + } + r.push(`up, and you let ${his} lie there for a while, tortured by anticipation and arousal, before giving ${his} nearest buttock a harsh open-handed slap. The shock and pain send ${him} over the edge immediately, and ${he} grinds forward into the desk involuntarily; the feeling of the cool desk against ${his}`); + if (eventSlave.dick > 0) { + r.push(`dickhead`); + } else if (eventSlave.vagina === -1) { + r.push(`crotch`); + } else { + r.push(`mons`); + } + r.push(`slams ${him} into a second climax, and ${he} sobs with overstimulation. You keep ${him} there for a good long while, using ${him} as a desktop toy that makes interesting noises when you hit it.`); + break; + } + if (eventSlave.fetishStrength > 95) { + r.push(`Since ${he}'s totally sure of what gets ${him} off, this proof you know it too makes ${him} <span class="trust inc">trust you.</span>`); + eventSlave.trust += 5; + } else { + r.push(`Since ${he}'s developing ${his} kinks, this reinforcement of ${his} sexual identity <span class="fetish inc">advances ${his} fetish.</span>`); + eventSlave.fetishStrength += 4; + } + return r; + } + + function sucks() { + r = []; + r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. From now on, ${he} can come to you and ask to`); + if (PC.dick === 0) { + r.push(`perform cunnilingus on you`); + } else { + r.push(`blow you`); + if (PC.vagina !== -1) { + r.push(`and eat you out`); + } + } + r.push(r.pop() + `, and masturbate while ${he} does. ${He} nods through ${his} tears and hurriedly gets to ${his} knees, gagging in ${his} clumsy eagerness, crying a little with relief as ${he} masturbates furiously`); + if (PC.vagina !== -1 && PC.dick !== 0) { + r.push(`and does ${his} best to simultaneously please both a cock and a cunt with only one mouth`); + } + r.push(r.pop() + `. ${He} doesn't even pause after ${his} first orgasm; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`); + eventSlave.devotion += 4; + seX(eventSlave, "oral", PC, "penetrative", 5); + const givingHead = PC.dick === 0 ? `giving head` : `sucking cock`; + if (eventSlave.fetish === "cumslut" && eventSlave.fetishKnown === 1) { + eventSlave.fetishStrength += 4; + r.push(`<span class="fetish inc">${His} enjoyment of ${givingHead} has increased.</span>`); + } else if (random(1, 100) > 50) { + eventSlave.fetishStrength = 65; + eventSlave.fetish = "cumslut"; + eventSlave.fetishKnown = 1; + r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of ${givingHead}.</span>`); + } + return r; + } + + function nipple() { + r = []; + r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. From now on, ${he} can come to you and offer you ${his} breasts; ${he} will be allowed to masturbate while you do. ${He} nods through ${his} tears and hurriedly presents ${his} chest, crying a little with relief as ${he} feels`); + if (eventSlave.nipples !== "fuckable") { + r.push(`you nip a nipple with your teeth.`); + } else if (PC.dick !== 0) { + r.push(`your dick slip into a nipple.`); + } else { + r.push(`your tongue penetrate into ${his} nipple.`); + } + r.push(`${He} masturbates furiously, not even pausing after ${his} first orgasm; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`); + eventSlave.devotion += 4; + seX(eventSlave, "mammary", PC, "penetrative", 5); + if (eventSlave.fetish === "boobs" && eventSlave.fetishKnown === 1) { + eventSlave.fetishStrength += 4; + r.push(`<span class="fetish inc">${His} enjoyment of breast play has increased.</span>`); + } else if (random(1, 100) > 50) { + eventSlave.fetishStrength = 65; + eventSlave.fetish = "boobs"; + eventSlave.fetishKnown = 1; + r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at every brush against ${his} breasts.</span>`); + } + return r; + } + + function insemination() { + r = []; + r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, ${he} can come to you and offer you ${his}`); + if (eventSlave.vagina > 3) { + r.push(`hopelessly gaped pussy;`); + } else if (eventSlave.vagina > 2) { + r.push(`loose pussy;`); + } else if (eventSlave.vagina > 1) { + r.push(`nice pussy;`); + } else { + r.push(`tight pussy;`); + } + r.push(`${he} will be allowed to masturbate while you fill ${him} with cum. ${He} nods through ${his} tears and`); + if (eventSlave.belly >= 10000) { + r.push(`struggles to get`); + } else { + r.push(`hurriedly gets`); + } + r.push(`up on your desk, lying on ${his} side and using one hand to spread ${his} buttocks apart while the other is poised to touch ${himself}. ${He} starts crying a little with relief as ${he} feels you slowly insert`); + if (PC.dick === 0) { + r.push(`a spurting strap-on`); + } else { + r.push(`your cock`); + } + r.push(`into ${his} spasming cunt. ${He} masturbates furiously, not even pausing after ${his} first orgasm; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`); + r.push(VCheck.Vaginal(eventSlave, 5)); + eventSlave.devotion += 4; + if (eventSlave.fetish === "pregnancy" && eventSlave.fetishKnown === 1) { + eventSlave.fetishStrength += 4; + r.push(`<span class="fetish inc">${His} enjoyment of pregnancy play has increased.</span>`); + } else if (random(1, 100) > 50) { + eventSlave.fetishStrength = 65; + eventSlave.fetish = "pregnancy"; + eventSlave.fetishKnown = 1; + r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of getting pregnant.</span>`); + } + return r; + } + + function ass() { + r = []; + r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, ${he} can come to you and offer you ${his}`); + if (eventSlave.anus > 3) { + r.push(`hopelessly gaped rectum;`); + } else if (eventSlave.anus > 2) { + r.push(`big slit of an asspussy;`); + } else if (eventSlave.anus > 1) { + r.push(`nice asspussy;`); + } else { + r.push(`tight asshole;`); + } + r.push(`${he} will be allowed to masturbate while you buttfuck ${him}. ${He} nods through ${his} tears and`); + if (eventSlave.belly >= 10000) { + r.push(`struggles to get`); + } else { + r.push(`hurriedly gets`); + } + r.push(`up on your desk, lying on ${his} side and using one hand to spread ${his} buttocks apart while the other is poised to touch ${himself}. ${He} starts crying a little with relief as ${he} feels you slowly insert`); + if (PC.dick === 0) { + r.push(`a strap-on`); + } else { + r.push(`your cock`); + } + r.push(`into ${his} spasming rectum. ${He} masturbates furiously, not even pausing after ${his} first orgasm; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`); + r.push(VCheck.Anal(eventSlave, 5)); + eventSlave.devotion += 4; + if (eventSlave.fetish === "buttslut" && eventSlave.fetishKnown === 1) { + eventSlave.fetishStrength += 4; + r.push(`<span class="fetish inc">${His} enjoyment of anal has increased.</span>`); + } else if (random(1, 100) > 50) { + eventSlave.fetishStrength = 65; + eventSlave.fetish = "buttslut"; + eventSlave.fetishKnown = 1; + r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of anal sex.</span>`); + } + return r; + } + + function inPublic() { + r = []; + r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, ${he} can masturbate in public, sitting with ${his} legs spread for as much exposure as possible. ${He} nods through ${his} tears and sprints out of your office, dripping as ${he} goes. ${He} throws ${himself} to the ground outside, to the considerable amusement of passersby, spreading ${his} legs painfully wide. ${He} masturbates furiously, not even pausing after ${his} first orgasm; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`); + eventSlave.devotion += 4; + if (eventSlave.fetish === "humiliation" && eventSlave.fetishKnown === 1) { + eventSlave.fetishStrength += 4; + r.push(`<span class="fetish inc">${His} enjoyment of humiliation has increased.</span>`); + } else if (random(1, 100) > 50) { + eventSlave.fetishStrength = 65; + eventSlave.fetish = "humiliation"; + eventSlave.fetishKnown = 1; + r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s starting to long for humiliation.</span>`); + } + return r; + } + + function submitting() { + r = []; + r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules.`); + if (canDoVaginal(eventSlave)) { + r.push(`For the rest of the week, ${he} can come to you and offer you ${his}`); + if (eventSlave.vagina > 3) { + r.push(`hopelessly loose pussy;`); + } else if (eventSlave.vagina > 2) { + r.push(`big slit of a pussy;`); + } else if (eventSlave.vagina > 1) { + r.push(`nice pussy;`); + } else { + r.push(`tight pussy;`); + } + r.push(`${he} will be allowed to masturbate after, but only after, you are finished with ${him}. ${He} nods through ${his} tears and`); + if (eventSlave.belly >= 10000) { + r.push(`struggles to get`); + } else { + r.push(`hurriedly gets`); + } + r.push(`up on your desk, lying on ${his} side and using one hand to spread ${his} nether lips apart while the other is poised to touch ${himself}. ${He} starts crying a little with relief as ${he} feels you slowly insert`); + if (PC.dick === 0) { + r.push(`a strap-on`); + } else { + r.push(`your cock`); + } + r.push(`into ${his} spasming vagina. You are not gentle, and despite the stimulation ${he} does not orgasm by the time you`); + if (PC.dick === 0) { + r.push(`climax to the vibrations of the strap-on, and the pleasure of buttfucking a bitch.`); + } else { + r.push(`blow your load in ${his} ass.`); + } + r.push(`${He}'s so eager to get off ${he} doesn't bother to move, and just`); + if (eventSlave.belly >= 1500) { + r.push(`snakes a hand down to fondle ${himself}.`); + } else { + r.push(`rolls onto ${his} face to hump ${himself} against ${his} hand, against the desk.`); + } + if (PC.dick === 0) { + r.push(`After the momentary pause of your climax, you`); + if (PC.vagina !== -1) { + r.push(`use a little manual stimulation of your pussy to force yourself to total hardness again and`); + } + r.push(`resume thrusting;`); + } else { + r.push(`Your cum leaks out of ${his} used cunt and onto ${his} working hand;`); + } + r.push(`${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`); + r.push(VCheck.Vaginal(eventSlave, 5)); + } else if (canDoAnal(eventSlave)) { + r.push(`For the rest of the week, ${he} can come to you and offer you ${his}`); + if (eventSlave.anus > 3) { + r.push(`hopelessly gaped rectum;`); + } else if (eventSlave.anus > 2) { + r.push(`big slit of an asspussy;`); + } else if (eventSlave.anus > 1) { + r.push(`nice asspussy;`); + } else { + r.push(`tight asshole;`); + } + r.push(`${he} will be allowed to masturbate after, but only after, you are finished with ${him}. ${He} nods through ${his} tears and`); + if (eventSlave.belly >= 10000) { + r.push(`struggles to get`); + } else { + r.push(`hurriedly gets`); + } + r.push(`up on your desk, lying on ${his} side and using one hand to spread ${his} buttocks apart while the other is poised to touch ${himself}. ${He} starts crying a little with relief as ${he} feels you slowly insert`); + if (PC.dick === 0) { + r.push(`a strap-on`); + } else { + r.push(`your cock`); + } + r.push(`into ${his} spasming rectum. You are not gentle, and despite the anal stimulation ${he} does not orgasm by the time you`); + if (PC.dick === 0) { + r.push(`climax to the vibrations of the strap-on, and the pleasure of buttfucking a bitch.`); + } else { + r.push(`blow your load in ${his} ass.`); + } + r.push(`${He}'s so eager to get off ${he} doesn't bother to move, and just`); + if (eventSlave.belly >= 1500) { + r.push(`snakes a hand down to fondle ${himself}.`); + } else { + r.push(`rolls onto ${his} face to hump ${himself} against ${his} hand, against the desk.`); + } + if (PC.dick === 0) { + r.push(`After the momentary pause of your climax, you`); + if (PC.vagina !== -1) { + r.push(`use a little manual stimulation of your pussy to force yourself to total hardness again and`); + } + r.push(`resume thrusting;`); + } else { + r.push(`Your cum leaks out of ${his} used backdoor and onto ${his} working hand;`); + } + r.push(`${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`); + r.push(VCheck.Anal(eventSlave, 5)); + } else { + r.push(`For the rest of the week, ${he} can come to you and politely ask to`); + if (PC.dick !== 0) { + r.push(`suck you off;`); + } else { + r.push(`eat you out;`); + } + r.push(`${he} will be allowed to masturbate after, but only after, you are satisfied. ${He} nods through ${his} tears and`); + if (eventSlave.belly >= 300000) { + r.push(`leans over ${his} ${belly} stomach,`); + } else { + if (eventSlave.belly >= 10000) { + r.push(`struggles`); + } else { + r.push(`hurriedly gets`); + } + r.push(`to ${his} knees,`); + } + r.push(`where ${he} brings ${his} face to your`); + if (PC.dick !== 0) { + r.push(`erect cock`); + } else { + r.push(`moist pussy`); + } + r.push(`and ${his} hand to ${his} crotch. ${He} starts crying a little with relief as ${he} feels you slowly`); + if (PC.dick === 0) { + r.push(`push your slit against`); + } else { + r.push(`insert your cock into`); + } + r.push(`${his} mouth. You are not gentle, and by the time you`); + if (PC.dick !== 0) { + r.push(`blow your load down ${his} throat,`); + } else { + r.push(`splash ${his} face with your girlcum,`); + } + r.push(`${he} still hasn't reached ${his} climax. ${He}'s so eager to get off ${he} doesn't bother to move, and just humps ${himself} against ${his} hand, against`); + if (eventSlave.belly >= 300000) { + r.push(`${his} belly.`); + } else { + r.push(`your leg.`); + } + if (PC.dick === 0) { + r.push(`After the momentary pause of your climax, you`); + if (PC.vagina !== -1) { + r.push(`use a little manual stimulation of your pussy to force yourself to total hardness again and`); + } + r.push(`resume thrusting;`); + } else { + r.push(`After the momentary pause of your climax, you pull ${his} face back to your crotch for a second round;`); + } + r.push(`${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`); + seX(eventSlave, "oral", PC, "penetrative", 5); + } + eventSlave.devotion += 4; + if (eventSlave.fetish === "submissive" && eventSlave.fetishKnown === 1) { + eventSlave.fetishStrength += 4; + r.push(`<span class="fetish inc">${His} enjoyment of submission has increased.</span>`); + } else if (random(1, 100) > 50) { + eventSlave.fetishStrength = 65; + eventSlave.fetish = "submissive"; + eventSlave.fetishKnown = 1; + r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of submission.</span>`); + } + return r; + } + + function pain() { + r = []; + r.push(`You tell ${him} that ${he} deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, ${he} can come to you and masturbate: but you will abuse ${him} while ${he} does. ${He} starts to cry in fear, but`); + if (eventSlave.belly >= 10000) { + r.push(`struggles to get`); + } else { + r.push(`hurriedly gets`); + } + r.push(`up on your desk anyway. You swat ${his} thighs apart so ${he} can get a hand down there. ${He} hesitates desperately before touching ${himself}, knowing that as soon as ${he} does the pain will start, but ${his} horniness wins out. You aim a vicious flick at ${his}`); + if (eventSlave.nipples === "huge") { + r.push(`absurd nipples`); + } else if (eventSlave.nipples !== "tiny") { + r.push(`big nipples`); + } else { + r.push(`nipples`); + } + r.push(`and then take a crop out of your desk, flogging ${his}`); + if ((eventSlave.boobsImplant/eventSlave.boobs) >= 0.60) { + r.push(`fake`); + } else if (eventSlave.boobs > 1000) { + r.push(`jiggling`); + } else { + r.push(`firm`); + } + r.push(`breasts without mercy. ${He} finally orgasms and flees, falling over ${his} own feet in ${his} desperation; ${his} acceptance of sexual slavery <span class="devotion inc">has increased.</span>`); + eventSlave.devotion += 4; + if (eventSlave.fetish === "masochist" && eventSlave.fetishKnown === 1) { + eventSlave.fetishStrength += 4; + r.push(`<span class="fetish inc">${His} enjoyment of pain has increased.</span>`); + } else if (random(1, 100) > 50) { + eventSlave.fetishStrength = 65; + eventSlave.fetish = "masochist"; + eventSlave.fetishKnown = 1; + r.push(`Before ${he} realizes what's happening, <span class="fetish gain">${he}'s getting aroused at the thought of ${his} ${getWrittenTitle(eventSlave)} beating ${him}.</span>`); + } + return r; + } + + function virginityWarning() { + if ((canDoVaginal(eventSlave) && eventSlave.vagina === 0) || (canDoAnal(eventSlave) && eventSlave.anus === 0)) { + return `This option may take ${his} virginity`; + } + } + } +}; diff --git a/src/events/RESS/review/devotedOld.js b/src/events/RESS/review/devotedOld.js new file mode 100644 index 0000000000000000000000000000000000000000..61c8ec02fd5dd1481afba1d81374ea0acc7ed8b6 --- /dev/null +++ b/src/events/RESS/review/devotedOld.js @@ -0,0 +1,168 @@ +App.Events.RESSDevotedOld = class RESSDevotedOld extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + hasAnyLegs, + canTalk, + s => s.devotion > 60, + s => s.trust > 20, + s => s.physicalAge > 37, + s => s.anus > 0, + s => s.vagina > 0, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, himself, girl + } = getPronouns(eventSlave); + const {title: Master, say} = getEnunciation(eventSlave); + const belly = bellyAdjective(eventSlave); + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + let r = []; + App.Events.addParagraph(node, [ + `At the end of a long week,`, + contextualIntro(V.PC, eventSlave, "DOM"), + `moves past your office toward bed. This is completely normal part of the arcology routine, but you notice as ${he} passes that ${he}'s wearing a preoccupied, almost sad expression. You call ${him} over, and ${he} makes a visible effort to brighten up as ${he} comes before you and asks your pleasure. You ask ${him} what's the matter, and ${his} face falls.` + ]); + r.push(Spoken(eventSlave, `"${Master}, I'm so sorry you noticed,"`)); + if (eventSlave.lips > 70) { + r.push(`${he} lisps through ${his} dick-sucking lips.`); + } else if ((eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2)) { + r.push(`${he} lisps through ${his} ridiculous piercings.`); + } else { + r.push(`${he} ${say}s penitently.`); + } + r.push(Spoken(eventSlave, `"I'm feeling a little stiff and tired, ${Master}. I wish I was a little younger so I could serve you better, that's all."`)); + + App.Events.addParagraph(node, r); + App.Events.addResponses(node, [ + (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) + ? new App.Events.Result(`Cheer ${him} up`, cheer) + : new App.Events.Result(), + new App.Events.Result(`Perform a health exam personally`, exam), + (S.HeadGirl && V.HeadGirlID !== eventSlave.ID) + ? new App.Events.Result(`Give ${him} an afternoon off for some quality time with your Head Girl`, quality, `This option will cost ${cashFormat(500)}`) + : new App.Events.Result() + ]); + + function cheer() { + let didVaginal = false; + let didAnal = false; + r = []; + r.push(`You close in on ${him}, and ${he} starts to present ${himself} with the force of long habit. However, you take ${him} by the hand and draw ${him} in close, running your fingertips along ${his} cheekbone, looking into ${his} ${App.Desc.eyesColor(eventSlave)}.`); + if (canSee(eventSlave)) { + r.push(`${He} only holds your gaze for a brief moment before blushing and looking down again,`); + } else { + r.push(`Once ${he} feels your hand stop, ${he} quickly glances down while`); + } + r.push(`muttering another apology. You raise ${his} chin again with a gentle hand and give ${him} a deep kiss. After a moment ${he} hugs you with almost painful`); + if (eventSlave.belly >= 100000) { + r.push(`fierceness, a feat given the size of ${his} ${belly}`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`gravid`); + } + r.push(`belly, where`); + } else if (eventSlave.belly >= 5000) { + r.push(`fierceness, pushing ${his} ${belly}`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`gravid`); + } + r.push(`belly into yours, where`); + } else { + r.push(`fierceness, and`); + } + r.push(`you can feel a heat radiating from ${him}. ${He} makes to get down on ${his} knees to serve you again, but instead, you`); + if (eventSlave.belly >= 300000) { + r.push(`help ${him} up and guide`); + } else if (eventSlave.belly >= 5000) { + r.push(`gently scoop ${him} up and carry`); + } else { + r.push(`scoop ${him} up and carry`); + } + r.push(`${him} to bed, laying the bemused ${girl} down before cuddling up behind ${him}. The two of you make languid love, with you`); + if (canHear(eventSlave)) { + r.push(`murmuring reassuringly into ${his} ear,`); + } + r.push(`nibbling ${his} neck, cupping ${his} breasts,`); + if (eventSlave.belly >= 1500) { + r.push(`rubbing ${his} distended midriff,`); + } + r.push(`and massaging ${his} shoulders by turns. After a lovely climax together in ${his}`); + if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) { + r.push(`pussy ${he} coquettishly shifts ${himself} to line your recovering cock up with ${his} ass,`); + didVaginal = true; + didAnal = true; + } else if (canDoVaginal(eventSlave)) { + r.push(`pussy ${he} coquettishly shifts ${himself} to face you,`); + didVaginal = true; + } else { + r.push(`ass ${he} coquettishly shifts ${himself} to face you,`); + didAnal = true; + } + if (canSee(eventSlave)) { + r.push(`looking with <span class="devotion inc">adoration</span> and new <span class="trust inc">confidence</span> into your eyes.`); + } else { + r.push(`gazing with <span class="devotion inc">adoration</span> and new <span class="trust inc">confidence</span> at your face.`); + } + eventSlave.devotion += 4; + eventSlave.trust += 4; + if (didVaginal && didAnal) { + r.push(VCheck.Both(eventSlave, 1)); + } else if (didVaginal) { + r.push(VCheck.Vaginal(eventSlave, 1)); + } else if (didAnal) { + r.push(VCheck.Anal(eventSlave, 1)); + } + return r; + } + + function exam() { + r = []; + r.push(`${He} gets a weekly health exam from the automated systems, which also do their best to monitor ${his} well-being, but ${he} does not protest as you take ${him} to the surgery and give ${him} a`); + if (V.PC.skill.medicine >= 100) { + r.push(`professional examination. It feels good to put the old skills to use on an attractive patient.`); + } else { + r.push(`thorough examination.`); + } + r.push( + `There's nothing the matter other than that ${he} hasn't been 18 for a long time. ${He} looks a little sad at some of the results, but whenever ${he} does, you place a hand on ${his} cheek and give ${him} a kiss. ${He} gets the idea.`, + Spoken(eventSlave, `"I understand, ${Master}. I can still serve you,"`), + `${he} ${say}s.` + ); + r.push(`You adjust ${his} diet and exercise a little, which should <span class="health inc">slightly improve</span> ${his} health`); + if (V.PC.skill.medicine >= 100) { + r.push(r.pop() + `, and prescribe some new supplements that might help ${him} <span class="health inc">feel ${his} best</span> all the time`); + improveCondition(eventSlave, 10); + } + r.push(r.pop() + `. As ${he} gets up from the chair and makes to resume ${his} duties, you give ${him} a light swat across the buttocks. ${He} squeaks and turns to <span class="trust inc">giggle at you,</span> giving you a broad wink and shaking ${his} tits a little for you.`); + eventSlave.trust += 4; + improveCondition(eventSlave, 10); + return r; + } + + function quality() { + const { + He2, his2, himself2 + } = getPronouns(S.HeadGirl).appendSuffix('2'); + cashX(-500, "event", eventSlave); + improveCondition(eventSlave, 10); + S.HeadGirl.devotion += 4; + eventSlave.devotion += 4; + return `${S.HeadGirl.slaveName} understands the situation immediately. ${He2} gets ${himself2} and ${eventSlave.slaveName} dressed for a nice, non-sexual 'date' in ${V.clubName}, and leads ${him} out by the hand with a wink over ${his2} shoulder to you. Your Head Girl understands just what kind of break from sexual servitude ${eventSlave.slaveName} really needs. They enjoy a nice meal, take a stroll and talk as friends, and get some inconsequential but relaxing beauty treatments together. They both <span class="devotion inc">enjoy the relaxation,</span> and ${eventSlave.slaveName} <span class="health inc">feels much better</span> after the rest, too.`; + } + } +}; diff --git a/src/events/RESS/review/dickgirlPC.js b/src/events/RESS/review/dickgirlPC.js new file mode 100644 index 0000000000000000000000000000000000000000..eb70864d314ffe6341caaee8c10193079f97cc42 --- /dev/null +++ b/src/events/RESS/review/dickgirlPC.js @@ -0,0 +1,633 @@ +App.Events.RESSDickgirlPC = class RESSDickgirlPC extends App.Events.BaseEvent { + eventPrerequisites() { + return [ + () => V.PC.dick > 0, + () => V.PC.boobs >= 300, + ]; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + hasAnyLegs, + canSee, + s => s.devotion > -20, + s => s.devotion <= 50, + s => (s.attrXY <= 35 && s.attrXX > 65) || (s.attrXY > 65 && s.attrXX <= 35), + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + His, He, he, his, him, himself, girl + } = getPronouns(eventSlave); + const {title: Master, say} = getEnunciation(eventSlave); + const PC = V.PC; + const belly = bellyAdjective(eventSlave); + const arms = hasBothArms(eventSlave) ? "arms" : "arm"; + + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + App.Events.addParagraph(node, [ + `Having just enjoyed one of your slaves, you take a quick post-coital rinse in one of the showers scattered around the arcology for the purpose. Thus refreshed, you step out and come face to face with`, + App.UI.DOM.combineNodes(contextualIntro(PC, eventSlave, "DOM"), ","), + `who is going about ${his} assigned business. ${His} ${App.Desc.eyesColor(eventSlave)} lock with yours for a surprised moment, and then flick down submissively.` + ]); + + let r = []; + r.push(`As ${his} gaze travels down your body towards the floor,`); + if (eventSlave.attrXY <= 35) { + r.push(`it lingers for a moment on your`); + if (PC.boobs >= 1400) { + r.push(`enormous`); + if (PC.boobsImplant > 0) { + r.push(`chest balloons`); + } else { + r.push(`cow tits`); + } + } else if (PC.boobs >= 1200) { + r.push(`huge,`); + if (PC.boobsImplant > 0) { + r.push(`clearly fake`); + } else { + r.push(`heavy`); + } + r.push(`breasts`); + } else if (PC.boobs >= 1000) { + r.push(`big`); + if (PC.boobsImplant > 0) { + r.push(r.pop() + `, perky`); + } + r.push(`breasts`); + } else if (PC.boobs >= 800) { + r.push(`generous breasts`); + } else if (PC.boobs >= 650) { + r.push(`handfilling breasts`); + } else if (PC.boobs >= 500) { + r.push(`average breasts`); + } else if (PC.boobs >= 300) { + r.push(`small breasts`); + } + r.push(`before continuing to track downward. When it reaches your cock, still half-hard from the sex and the warm shower, ${he} stiffens with discomfort.`); + } else { + r.push(`${he} averts ${his} eyes from your`); + if (PC.boobs >= 1400) { + r.push(`enormous, bare`); + if (PC.boobsImplant > 0) { + r.push(`chest balloons`); + } else { + r.push(`cow tits`); + } + } else if (PC.boobs >= 1200) { + r.push(`huge, bare,`); + if (PC.boobsImplant > 0) { + r.push(`clearly fake`); + } else { + r.push(`heavy`); + } + r.push(`breasts`); + } else if (PC.boobs >= 1000) { + r.push(`big, bare`); + if (PC.boobsImplant > 0) { + r.push(r.pop() + `, perky`); + } + r.push(`breasts`); + } else if (PC.boobs >= 800) { + r.push(`generous, bare breasts`); + } else if (PC.boobs >= 650) { + r.push(`handfilling, bare breasts`); + } else if (PC.boobs >= 500) { + r.push(`average, bare breasts`); + } else if (PC.boobs >= 300) { + r.push(`small, bare breasts`); + } + r.push(`as best ${he} can, quickly looking farther down. ${His} gaze lingers for a moment on your cock, still half-hard from the sex and the warm shower, but ${he}'s stiff with discomfort.`); + } + r.push(`${He} swallows uncomfortably, frozen in place and staring at the floor. ${His} eyes flick up again, stealing a glance at`); + if (eventSlave.attrXY <= 35) { + r.push(`your boobs and studiously avoiding your dick.`); + } else { + r.push(`your dick`); + if (PC.balls >= 8) { + r.push(`and enormous testicles, while`); + } else { + r.push(`and`); + } + r.push(`studiously avoiding your boobs.`); + } + if (!canTalk(eventSlave)) { + r.push(`${He} gestures a proper greeting, hands shaking with nervousness.`); + } else { + r.push( + Spoken(eventSlave, `"Um, hi, ${Master},"`), + `${he} ${say}s nervously.` + ); + } + App.Events.addParagraph(node, r); + if (eventSlave.attrKnown !== 1) { + App.Events.addParagraph(node, [`Just like that, the existing mystery about ${his} feelings about girls and guys is <span class="lightcoral">cleared up.</span>`]); + eventSlave.attrKnown = 1; + } + + App.Events.addResponses(node, [ + new App.Events.Result(`Permit ${him} to serve you in a way ${he}'ll be comfortable with`, permit), + new App.Events.Result(`Force ${him} to get off to all of you`, force, virginityWarning()), + ]); + + function virginityWarning() { + if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0) && eventSlave.attrXY <= 35) { + return `This option will take ${his} virginity`; + } else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave) && (eventSlave.anus === 0) && eventSlave.attrXY <= 35) { + return `This option will take ${his} anal virginity`; + } + } + + function permit() { + const frag = new DocumentFragment(); + r = []; + r.push(`The poor ${girl} is having trouble with`); + if (eventSlave.attrXY <= 35) { + r.push(`guys, so you decide to be kind to ${him} and play up your feminine side. You lift ${his} ${eventSlave.skin} chin with a soft touch, and kiss ${him} gently on the lips, pressing your breasts full against ${his}`); + if (eventSlave.boobs > 5000) { + r.push(`titanic udders, which are squashed between you.`); + } else if (eventSlave.boobs > 1000) { + r.push(`own lovely boobs.`); + } else { + r.push(`chest.`); + } + r.push(`You keep your hips cocked back and to the side, so that your rapidly stiffening dick stays clear of ${him}. Taking ${his} hands in your own, you guide them to your`); + if (PC.boobs >= 1400) { + r.push(`enormous`); + if (PC.boobsImplant !== 0) { + r.push(`chest balloons.`); + } else { + r.push(`cow tits.`); + } + } else if (PC.boobs >= 1200) { + r.push(`huge,`); + if (PC.boobsImplant !== 0) { + r.push(`clearly fake`); + } else { + r.push(`heavy`); + } + r.push(`breasts.`); + } else if (PC.boobs >= 1000) { + r.push(`big`); + if (PC.boobsImplant !== 0) { + r.push(r.pop() + `, perky`); + } + r.push(`breasts.`); + } else if (PC.boobs >= 800) { + r.push(`generous breasts.`); + } else if (PC.boobs >= 650) { + r.push(`handfilling breasts`); + } else if (PC.boobs >= 500) { + r.push(`average breasts`); + } else if (PC.boobs >= 300) { + r.push(`small breasts`); + } + App.Events.addParagraph(frag, r); + r = []; + r.push(`${He} hesitates, clearly surprised that you're allowing ${him} to fondle you, but building arousal is making ${him} forget ${his} awkwardness and ${he} begins to play with your boobs in earnest. You direct ${his} fingers to your nipples, and ${he} obeys the nonverbal cue, devoting more attention to the`); + if (PC.lactation > 0) { + r.push(`milky,`); + } else { + r.push(`hard,`); + } + r.push(`sensitive nubs. Satisfied that ${he}'s got the idea, you run your hands lightly down ${his}`); + if (eventSlave.weight > 190) { + r.push(`voluminous`); + } else if (eventSlave.belly >= 5000) { + if (eventSlave.bellyPreg >= 3000) { + r.push(`gravid`); + } else if (eventSlave.bellyImplant >= 3000) { + r.push(`rounded`); + } else { + r.push(`swollen`); + } + } else if (eventSlave.weight > 30) { + r.push(`soft`); + } else if (eventSlave.muscles > 30) { + r.push(`rock hard`); + } else if (eventSlave.weight > 10) { + r.push(`plush`); + } else if (eventSlave.muscles > 5) { + r.push(`toned`); + } else { + r.push(`soft`); + } + r.push(`body and give ${his}`); + if (eventSlave.butt > 15) { + r.push(`obscene`); + } else if (eventSlave.butt > 10) { + r.push(`absurd`); + } else if (eventSlave.butt > 6) { + r.push(`monstrous`); + } else if (eventSlave.butt > 3) { + r.push(`healthy`); + } else { + r.push(`cute`); + } + r.push(`buttocks a gentle massage.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`${He} has ${his} eyes closed, and is spared any indication that ${he}'s petting and being petted by a person with a cock. ${His} arousal builds quickly, and so does yours. You resolve the situation by using a hand on each of you: you finish yourself off with practiced ease while giving ${his}`); + if (canDoVaginal(eventSlave)) { + r.push(`clit`); + } else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`own erection`); + } else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`fat member`); + } else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`soft member`); + } else if (eventSlave.chastityPenis === 1) { + r.push(`nipples`); + } else if (eventSlave.chastityVagina) { + r.push(`nipples`); + } else { + r.push(`soft perineum`); + } + r.push(`some manual stimulation that tips ${him} over the edge. ${He} opens ${his} eyes slowly, <span class="devotion inc">grateful</span> that you were so merciful.`); + } else if (eventSlave.attrXX <= 35) { + r.push(`girls, so you decide to be kind to ${him} and play up your masculine side. You grab the side of ${his} neck with a rough grip, and pull ${him} downward, forcing ${him} to ${his} knees. ${He} goes willingly, ${his} field of vision filling with your rapidly hardening member.`); + if (eventSlave.teeth === "removable") { + r.push(`${He} quickly pulls ${his} removable teeth out, getting ready to offer you ${his} soft facepussy.`); + } else if (eventSlave.teeth === "pointy") { + r.push(`${He} runs ${his} tongue over ${his} frightening teeth carefully, and then opens ${his} jaws wide, getting ready to keep ${his} fangs well clear of your shaft.`); + } else if (eventSlave.teeth === "fangs") { + r.push(`${He} runs ${his} tongue over ${his} fangs carefully, and then opens ${his} jaws wide, getting ready to keep ${his} teeth well clear of your shaft.`); + } else if (eventSlave.teeth === "fang") { + r.push(`${He} gets ready to take you from an angle to avoid ${his} fang meeting your member.`); + } else if (eventSlave.teeth === "straightening braces" || eventSlave.teeth === "cosmetic braces") { + r.push(`${He} runs ${his} tongue over ${his} braces, and then opens wide, mindful of keeping ${his} orthodontia clear of your shaft.`); + } else if (eventSlave.teeth === "gapped") { + r.push(`${He} runs ${his} tongue across the gap in ${his} front teeth and opens wide.`); + } + r.push(`${He} takes you into ${his} mouth without hesitation, and keeps ${his} eyes closed. ${He} visibly concentrates all ${his} attention on your dick, ignoring the breasts that are starting to bounce right over ${his} head as you begin rocking your hips with enjoyment.`); + App.Events.addParagraph(frag, r); + App.Events.addParagraph(frag, [`You run a possessive hand through ${his} ${eventSlave.hColor} hair, and let ${him} know what a good little cocksucker ${he} is. ${He} moans submissively in response, and the humming feels so wonderful that you order ${him} to do it again. Knowing that you're being nice to ${him} by letting ${his} ignore your more feminine characteristics for the moment, ${he} does ${his} best to please you, humming as best ${he} can and using both hands to pleasure your base and balls. You blow your load down ${his} throat, and ${he} swallows it all. ${He} opens ${his} eyes slowly, <span class="trust inc">relieved</span> that you were so merciful.`]); + } + eventSlave.trust += 4; + seX(eventSlave, "oral", PC, "penetrative"); + return frag; + } + + function force() { + const frag = new DocumentFragment(); + r = []; + r.push(`The closeminded ${girl} is having trouble with`); + if (eventSlave.attrXY <= 35) { + r.push(`guys, so ${he} gets to spend some quality time with your dick. You walk into ${him}, running into the surprised slave, driving ${him} backward into the far wall. You kiss ${him}, pinch ${him}, and grope ${him} roughly the whole time, pressing your breasts maliciously against ${his}`); + if (eventSlave.boobs > 5000) { + r.push(`titanic udders, which are squashed between you.`); + } else if (eventSlave.boobs > 1000) { + r.push(`own lovely boobs.`); + } else { + r.push(`chest.`); + } + r.push(`When ${his}`); + if (eventSlave.butt > 15) { + r.push(`obscene`); + } else if (eventSlave.butt > 10) { + r.push(`absurd`); + } else if (eventSlave.butt > 6) { + r.push(`monstrous`); + } else if (eventSlave.butt > 3) { + r.push(`healthy`); + } else { + r.push(`cute`); + } + r.push(`buttocks crash against the wall, you smash yourself against ${him}. ${He} shudders involuntarily as ${he} feels your stiffening dick between you`); + if (eventSlave.belly >= 5000) { + r.push(`and ${his} rounded stomach`); + } + r.push(r.pop() + `, and then again as it rapidly achieves full hardness, crushed between your warm bodies.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`Making out with ${him} so insistently that ${he}'s short of breath, you begin to hump yourself against ${him}, sliding your prick against ${his}`); + if (eventSlave.belly >= 5000) { + r.push(belly); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnant`); + } + } + r.push(`belly, thighs, and`); + if (canDoVaginal(eventSlave)) { + r.push(`labia.`); + } else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`own dick.`); + } else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`fat cock.`); + } else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`limp member.`); + } else if (eventSlave.chastityPenis === 1) { + r.push(`caged dick.`); + } else if (eventSlave.chastityVagina) { + r.push(`chastity belt.`); + } else { + r.push(`soft perineum.`); + } + r.push(`${He} shudders uncomfortably as ${he} realizes that ${he}'s getting aroused, ${his}`); + if (eventSlave.vagina > -1) { + r.push(`pussy moistening`); + } else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`dick hardening`); + } else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`dick struggling to engorge`); + } else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`girldick starting to ooze precum`); + } else if (eventSlave.chastityPenis === 1) { + r.push(`chastity cage growing ever tighter`); + } else { + r.push(`tiny front hole starting to ooze precum`); + } + r.push(`from the stimulation, despite ${his} lack of appetite for cock.`); + if (!canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) { + r.push(`${He} knows what's coming when you push ${him}`); + if (eventSlave.belly >= 300000) { + r.push(`over ${his} ${belly} stomach,`); + } else { + r.push(`to ${his} knees,`); + } + r.push(`and does ${his} best to relax.`); + App.Events.addParagraph(frag, r); + App.Events.addParagraph(frag, [`${He} screws ${his} eyes shut tight and ${his} mouth tighter as you prod at ${his} face with your member. Tiring of ${his} reluctance, you give ${him} a brusque order to open ${his} eyes and gaze upon the dick ${he} will soon be deepthroating. ${He} obeys, but unwillingly, and steadies ${himself} to take its length. You tell ${him} to do ${his} best to watch, and begin thrusting. ${He} groans from the internal fullness and sexual confusion. ${He} stares as best ${he} can at your penis, transfixed by the sight of it thrusting into ${his} mouth and the feeling of ${his} lips around its girth.`]); + r = []; + r.push(`${He} slips a hand to ${his} crotch, ${his} arousal overwhelming ${his} preferences. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, holding back to ${his} point of climax before shooting your cum deep inside ${him}. The internal sensation of heat, the tightening and twitching of your member inside ${his} mouth, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} chokes on your cock. You pull out of ${him}, and ${he} struggles to catch ${his} breath, the action sending a blob of ${his} owner's semen running down ${his} chin.`); + seX(eventSlave, "oral", PC, "penetrative", 7); + } else if (eventSlave.belly >= 10000) { + r.push(`${He} knows what's coming when you push ${him}`); + if (eventSlave.belly >= 300000) { + r.push(`over ${his} ${belly} stomach,`); + } else { + r.push(`to ${his} knees,`); + } + r.push(`and does ${his} best to relax.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`${He} screws ${his} eyes shut tight as you maneuver yourself inside ${his}`); + if (canDoVaginal(eventSlave)) { + if (eventSlave.vagina > 2) { + r.push(`cavernous cunt.`); + } else if (eventSlave.vagina > 1) { + r.push(`welcoming pussy.`); + } else { + r.push(`tight flower.`); + } + } else { + if (eventSlave.anus > 2) { + r.push(`unresisting asspussy.`); + } else if (eventSlave.anus > 1) { + r.push(`welcoming butthole.`); + } else { + r.push(`tight anus.`); + } + } + r.push(`Once you're situated, you give ${him} a brusque order to open ${his} eyes and look behind ${him}. ${He} obeys, but unwillingly, bending as best ${he} can to see how physically close you are. ${He} can't see where it enters ${his}`); + if (canDoVaginal(eventSlave)) { + r.push(`womanhood,`); + } else { + r.push(`bowels,`); + } + r.push(`but ${he}'s very aware of it. You tell ${him} to do ${his} best to watch, and begin thrusting. ${He} groans from the awkward position, internal fullness, and sexual confusion. Turned as much as ${he} can, ${he} stares, transfixed by the sight of you thrusting into ${his} body.`); + if (canDoVaginal(eventSlave)) { + r.push(VCheck.Vaginal(eventSlave, 7)); + } else { + r.push(VCheck.Anal(eventSlave, 7)); + } + App.Events.addParagraph(frag, r); + r = []; + r.push(`You snake a hand under ${him} and begin to stimulate ${him} manually. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, bringing ${him} to the point of climax before shooting your cum deep inside ${him}. The internal sensation of heat, the tightening and twitching of your member inside ${him}, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} wriggles involuntarily against you. You release ${him}, and ${he} barely manages to catch ${himself} from collapsing, the motion sending a blob of ${his} owner's semen running down ${his} thigh.`); + } else { + r.push(`${He} knows what's coming when you pin ${his} torso even harder and reach down to pull ${his} knees up to clasp you around your waist, and does ${his} best to relax.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`${He} screws ${his} eyes shut tight as you maneuver yourself inside ${his}`); + if (canDoVaginal(eventSlave)) { + if (eventSlave.vagina > 2) { + r.push(`cavernous cunt.`); + } else if (eventSlave.vagina > 1) { + r.push(`welcoming pussy.`); + } else { + r.push(`tight flower.`); + } + } else { + if (eventSlave.anus > 2) { + r.push(`unresisting asspussy.`); + } else if (eventSlave.anus > 1) { + r.push(`welcoming butthole.`); + } else { + r.push(`tight anus.`); + } + } + r.push(`Once you're confident your member is properly seated inside ${him}, and you won't drop ${him}, you give ${him} a brusque order to open ${his} eyes and look down. ${He} obeys, but unwillingly, bending as best ${he} can to look at the base of your dick where it`); + if (canDoVaginal(eventSlave)) { + r.push(`enters ${his} womanhood.`); + } else { + r.push(`disappears beneath`); + if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`${his} own erect cock.`); + } else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`${his} own dangling cock.`); + } else if (eventSlave.chastityPenis === 1) { + r.push(`${his} chastity.`); + } else { + r.push(`${him}. ${He} can't see where it enters ${his} bowels, but ${he}'s very aware of it.`); + } + } + r.push(`You tell ${him} to do ${his} best to watch, and begin thrusting. ${He} groans from the awkward position, internal fullness, and sexual confusion. Bent almost in half, ${he} stares, transfixed by the sight of your penis delving inside ${his} body.`); + if (canDoVaginal(eventSlave)) { + r.push(VCheck.Vaginal(eventSlave, 7)); + } else { + r.push(VCheck.Anal(eventSlave, 7)); + } + App.Events.addParagraph(frag, r); + r = []; + r.push(`You push a hand between the two of you and begin to stimulate ${him} manually. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, bringing ${him} to the point of climax before shooting your cum deep inside ${him}. The internal sensation of heat, the tightening and twitching of your member inside ${him}, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} wriggles involuntarily within your grasp. You drop ${him}, and ${he} barely manages to catch ${himself} on shaking legs, the motion sending a blob of ${his} owner's semen running down ${his} thigh.`); + } + App.Events.addParagraph(frag, r); + r = []; + r.push(`Over the week, you force ${him} to achieve daily orgasm as your cock pounds in and out of ${him}. It's difficult, blowing your load inside a compliant slave ${girl} every day, but you make the necessary sacrifice.`); + if (random(1, 2) === 1) { + r.push(`After a few days, ${he}'s <span class="green">obviously reconsidering ${his} previous hesitations about dick.</span>`); + eventSlave.attrXY += 5; + } else { + r.push(`${He} takes it like a good slave. ${His} dislike for dick doesn't change, but ${he} gets better at <span class="devotion inc">suppressing ${his} own inclinations</span> and serving as your cum receptacle.`); + eventSlave.devotion += 4; + } + } else if (eventSlave.attrXX <= 35) { + r.push(`girls, so ${he} gets to spend some quality time with your feminine side. You kiss ${him}, teasing your tongue against ${him}, and press your breasts maliciously against ${his}`); + if (eventSlave.boobs > 5000) { + r.push(`titanic udders, which are squashed between you.`); + } else if (eventSlave.boobs > 1000) { + r.push(`own lovely boobs.`); + } else { + r.push(`chest.`); + } + r.push(`${He} shrinks away from you involuntarily, but you stroke loving hands down ${his} temples, the sides of ${his} neck, and ${his} upper arms. ${He} shudders involuntarily, and you can almost feel ${him} hate ${himself} through your lip lock. You cock your hips back and to the side, keeping your prick well clear of ${him}. As far as ${he} can feel, you're all boobs and feminine lips.`); + App.Events.addParagraph(frag, r); + r = []; + if (eventSlave.toyHole === "dick" || (V.policies.sexualOpenness === 1 && canPenetrate(eventSlave))) { + r.push(`You walk forward, pressing ${him} against the far wall, and then turn yourself around, pinning ${him} against the wall with your`); + if (eventSlave.belly >= 5000) { + r.push(`butt, working your way under ${his} ${belly} belly`); + } else { + r.push("butt."); + } + r.push(`As ${he} hesitates, wondering what to do about this, you grab ${his} hands and place them on your`); + if (PC.butt >= 5) { + r.push(`enormous,`); + if (PC.buttImplant !== 0) { + r.push(`beachball cheeks,`); + } else { + r.push(`wobbling ass,`); + } + } else if (PC.butt >= 4) { + r.push(`huge,`); + if (PC.buttImplant !== 0) { + r.push(`balloon of an`); + } else { + r.push(`soft`); + } + r.push(`ass,`); + } else if (PC.butt >= 3) { + r.push(`big`); + if (PC.buttImplant !== 0) { + r.push(`fake`); + } + r.push(`ass,`); + } else { + r.push(`ass,`); + } + r.push(`leading ${him} like a music teacher guiding a student's hands. When ${he}'s groping your buttocks properly, you grind against ${him} for a while, grinning to yourself as you feel an unwilling erection building between your cheeks. Pleased, you lean forward and line up your`); + if (PC.vagina !== -1) { + r.push(`pussy`); + } else { + r.push(`asshole`); + } + r.push(`with ${his} dick head and push back into ${him}. You repeat until ${his} hips start moving on their own. You bite on your finger at the sensation of ${his} cock inside you and, using your other hand, begin to jerk yourself off. Except for your vigorous stroking with one hand, there's little to indicate to ${him} that you have a dick; it must feel as though ${he} is banging a beautiful woman. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, taking ${him} to the point of climax before enjoying your own orgasm. The heat of your insides, the tightening and twitching of your`); + if (PC.vagina !== -1) { + r.push(`vagina`); + } else { + r.push(`rectum`); + } + r.push(`around ${his} cock, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} nearly knocks your to the floor. You scoot forward, letting ${him} slip from you. ${He} gets a splendid sight of your still gaped`); + if (PC.vagina !== -1) { + r.push(`cunt`); + } else { + r.push(`anus`); + } + r.push(`begging for more`); + if (eventSlave.balls > 0) { + r.push(`as a blob of ${his} semen drips from your body`); + } + r.push(r.pop() + `.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`Over the week, you require ${him} to repeat this sexually confusing performance daily. It's difficult, having to savor a compliant slave's penis every day, but you make the necessary sacrifice.`); + if (canImpreg(PC, eventSlave)) { + r.push(knockMeUp(PC, 40, 0, eventSlave.ID)); + } + } else if (eventSlave.belly >= 150000) { + r.push(`You walk forward, pressing ${him} against the far wall, and then turn yourself around, pinning ${him} against the wall with your butt, working your way under ${his} ${belly} belly. As ${he} hesitates, wondering what to do about this, you grab ${his} hands and place them on your`); + if (PC.butt >= 5) { + r.push(`enormous,`); + if (PC.buttImplant !== 0) { + r.push(`beachball cheeks,`); + } else { + r.push(`wobbling ass,`); + } + } else if (PC.butt >= 4) { + r.push(`huge,`); + if (PC.buttImplant !== 0) { + r.push(`balloon of an`); + } else { + r.push(`soft`); + } + r.push(`ass,`); + } else if (PC.butt >= 3) { + r.push(`big`); + if (PC.buttImplant !== 0) { + r.push(`fake`); + } + r.push(`ass,`); + } else { + r.push(`ass,`); + } + r.push(`leading ${him} like a music teacher guiding a student's hands. When ${he}'s groping your buttocks properly, you grind against ${him} for a while, grinning to yourself as you feel`); + if (canDoVaginal(eventSlave)) { + r.push(`an unwilling heat building low behind you. Pleased, you lean back and start to play with ${his} clit, using your other hand to jerk off.`); + } else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`an unwilling erection building between your cheeks. Pleased, you lean back and start to play with ${his} dick, using your other hand to jerk yourself off.`); + } else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`the huge cock behind you start to leak onto your back. Pleased, you lean back and start to play with ${his} dick, using your other hand to jerk yourself off.`); + } else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`the pretty girldick behind you start to leak. Pleased, you lean back and start to play with ${his} soft bitchclit, using your other hand to jerk yourself off.`); + } else if (eventSlave.chastityPenis === 1) { + r.push(`an unwilling heat building low behind you. Pleased, you lean back and start to tease ${his} chastity cage, using your other hand to jerk off.`); + } else if (eventSlave.chastityVagina) { + r.push(`an unwilling heat building low behind you. Pleased, you lean back and start to tease ${his} chastity, using your other hand to jerk off.`); + } else if (eventSlave.race === "catgirl") { + r.push(`a demure heat building behind you. Pleased, you lean back and start to play with the soft silky fur between ${his} legs.`); + } else { + r.push(`a demure heat building behind you. Pleased, you lean back and start to play with the soft smooth skin between ${his} legs.`); + } + r.push(`Except for your vigorous stroking with one hand, there's little to indicate to ${him} that you have a dick. It must feel as though ${he} has a beautiful woman under ${his} middle, and is playing with ${his} ass while ${he} gets ${him} off manually. You complete the feeling by bucking against ${him} with extra enthusiasm when you climax.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`Over the week, you require ${him} to repeat this sexually confusing performance daily. It's difficult, having to grind against a compliant slave every day, but you make the necessary sacrifice.`); + } else { + r.push(`You walk forward, pressing ${him} against the far wall, and then turn yourself around, pinning ${him} against the wall with your butt`); + if (eventSlave.belly >= 10000) { + r.push(`as well as you can with ${his} ${belly}`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnancy`); + } else { + r.push(`belly`); + } + r.push(`pushing into you`); + } + r.push(r.pop() + `. As ${he} hesitates, wondering what to do about this, you grab ${his} hands and place them on your tits, leading ${him} like a music teacher guiding a student's hands. When ${he}'s stroking your nipples properly, you grind against ${him} for a while, grinning to yourself as you feel`); + if (canDoVaginal(eventSlave)) { + r.push(`an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to play with ${his} clit, using your other hand to jerk off.`); + } else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`an unwilling erection building behind you. Pleased, you snake a hand around behind yourself and start to play with ${his} dick, using your other hand to jerk yourself off.`); + } else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`the huge cock behind you start to leak. Pleased, you snake a hand around behind yourself and start to play with ${his} dick, using your other hand to jerk yourself off.`); + } else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + r.push(`the pretty girldick behind you start to leak. Pleased, you snake a hand around behind yourself and start to play with ${his} soft bitchclit, using your other hand to jerk yourself off.`); + } else if (eventSlave.chastityPenis === 1) { + r.push(`an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease ${his} chastity cage, using your other hand to jerk off.`); + } else if (eventSlave.chastityVagina) { + r.push(`an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease ${his} chastity, using your other hand to jerk off.`); + } else if (eventSlave.race === "catgirl") { + r.push(`a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft silky fur between ${his} legs.`); + } else { + r.push(`a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft smooth skin between ${his} legs.`); + } + r.push(`Except for your vigorous stroking with one hand, there's little to indicate to ${him} that you have a dick. It must feel as though ${he} has a beautiful woman in ${his} ${arms}, and is playing with ${his} boobs while ${he} gets ${him} off manually. You complete the feeling by craning around to rain nibbles and kisses on ${his} ${eventSlave.faceShape} face.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`Over the week, you require ${him} to repeat this sexually confusing performance daily. It's difficult, having one of your slaves detailed to stimulate your nipples every day, but you make the necessary sacrifice.`); + } + if (random(1, 2) === 1) { + r.push(`After a few days, ${he}'s <span class="green">obviously reconsidering ${his} previous hesitations about tits and ass.</span>`); + eventSlave.attrXX += 5; + } else { + r.push(`${He} serves your feminine body like a good slave. ${His} dislike for sex with girls doesn't change, but ${he} gets better at <span class="devotion inc">suppressing ${his} own inclinations</span> and serving as your plaything.`); + eventSlave.devotion += 4; + } + } + App.Events.addParagraph(frag, r); + return frag; + } + } +}; diff --git a/src/events/RESS/review/hormoneDysfunction.js b/src/events/RESS/review/hormoneDysfunction.js new file mode 100644 index 0000000000000000000000000000000000000000..b4d6e4b3b7be784ee80644b40f2c31d0dc560a5b --- /dev/null +++ b/src/events/RESS/review/hormoneDysfunction.js @@ -0,0 +1,123 @@ +App.Events.RESSHormoneDysfunction = class RESSHormoneDysfunction extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + s => s.hormoneBalance >= 50, + s => s.vagina === -1, + s => s.balls >= 0, + s => s.devotion > 20 || s.trust < -20, + s => s.devotion <= 50, + s => s.fetish !== "buttslut", + s => s.rules.speech === "permissive" + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, himself, girl + } = getPronouns(eventSlave); + const {title: Master, say} = getEnunciation(eventSlave); + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + let r = []; + r.push( + App.UI.DOM.slaveDescriptionDialog(eventSlave), + `comes to see you. You're busy with other things, so ${he} waits patiently even though ${he}'s clearly very unhappy. Told to explain ${himself}, ${he} gestures at ${his} totally flaccid` + ); + if (!canTalk(eventSlave)) { + r.push(`penis.`); + } else { + if (eventSlave.lips > 70) { + r.push(`penis and ${say}s through ${his} huge lips,`); + } else if ((eventSlave.lipsPiercing + eventSlave.tonguePiercing > 2)) { + r.push(`penis and ${say}s through ${his} piercings,`); + } else { + r.push(`penis and ${say}s,`); + } + r.push(Spoken(eventSlave, `"${Master}, I can't get it up."`)); + } + r.push(`Ever since the rules have permitted it, ${contextualIntro(V.PC, eventSlave)} has been a constant masturbator. If ${he} can help it, ${he} never sucks or gives up ${his} ass without a hand between ${his} legs, pumping away.`); + App.Events.addParagraph(node, r); + + r = []; + if (!canTalk(eventSlave)) { + r.push(`${He} mimics masturbation and then traces a finger down ${his} cheek, as though it were a tear.`); + } else { + r.push(Spoken(eventSlave, `"I can't come like this, ${Master}."`)); + } + r.push(`It makes sense; ${he}'s probably never masturbated without a hard dick. ${He}'s clearly in desperate need of release, and more than a little sad the hormones ${he}'s taking have given ${him} erectile dysfunction.`); + + App.Events.addParagraph(node, r); + App.Events.addResponses(node, [ + new App.Events.Result(`Give ${him} some vasodilators so ${he} can get relief`, vasodilators), + new App.Events.Result(`Sissy slave ${girl}s don't need to climax to serve`, serve), + (eventSlave.prostate !== 0 && canDoAnal(eventSlave)) + ? new App.Events.Result(`Prostate stimulation ought to do the trick`, prostate, eventSlave.anus === 0 && canDoAnal(eventSlave) ? `This option will take ${his} virginity` : null) + : new App.Events.Result(), + ]); + + function vasodilators() { + eventSlave.devotion -= 5; + return `You give ${him} a shot and send ${him} on ${his} way. Within a few minutes it gives ${him} a raging hard-on that lasts for hours. ${He} spends every spare moment masturbating furiously. Of course, this is a temporary solution, and will just make the eventual return of ${his} problem more disappointing. <span class="devotion dec">${He} is bitterly frustrated.</span>`; + } + + function serve() { + r = []; + r.push(`You explain patiently that ${he} needs to stop focusing on getting off. ${He}'s a sex slave, and what matters is that ${he} pleasures others. If ${he} doesn't climax ${himself}, that's unfortunate but not really significant. ${He} looks terribly forlorn, so to drive home the point you push ${him} down to the floor, give ${him} a rough facefuck, and send ${him} away with tousled hair,`); + if (V.PC.dick === 0) { + r.push(`a tired tongue,`); + } else { + r.push(`a mouthful of ejaculate,`); + } + r.push(`and the same limp dick as before. <span class="devotion dec">It's frustrating for ${him}.</span>`); + eventSlave.devotion -= 2; + if (eventSlave.clitSetting !== eventSlave.fetish) { + r.push(`But, ${he} slowly <span class="fetish gain">accepts ${his} new role as a submissive little sex toy.</span>`); + eventSlave.fetishStrength = 65; + eventSlave.fetishKnown = 1; + eventSlave.fetishStrength = 10; + eventSlave.fetish = "submissive"; + } + seX(eventSlave, "oral", V.PC, "penetrative"); + return r; + } + + function prostate() { + r = []; + r.push(`You explain that ${he} will have to find a new way to climax to be a happy little shemale slut. As you do, you push ${him} against a wall and force ${him} up on tiptoe so that ${his} butt is conveniently positioned, and then ram`); + if (V.PC.dick === 0) { + r.push(`a vibrating strap-on`); + } else { + r.push(`yourself`); + } + r.push(`up ${his} ass. ${He} squeals and dances against the wall on tiptoe, impaled on your`); + if (V.PC.dick === 0) { + r.push(`fake cock.`); + } else { + r.push(`member.`); + } + r.push(`${He} doesn't climax to anal then, or the next time you assfuck ${him}, or the time after that; but some time later a long buttsex session ends when ${he} gives a little shake and a whimper and dribbles a pathetic squirt of cum from ${his} still-limp dick. By the end of the week <span class="mediumaquamarine">${he}'s smiling trustingly</span> and offering you ${his} butt every chance ${he} gets.`); + r.push(VCheck.Anal(eventSlave, 10)); + eventSlave.trust += 4; + if (eventSlave.clitSetting !== eventSlave.fetish) { + r.push(`<span class="fetish gain">${He}'s become a confirmed anal addict.</span>`); + eventSlave.fetishStrength = 65; + eventSlave.fetishKnown = 1; + eventSlave.fetishStrength = 10; + eventSlave.fetish = "buttslut"; + } + return r; + } + } +}; diff --git a/src/events/RESS/review/looseButtslut.js b/src/events/RESS/review/looseButtslut.js new file mode 100644 index 0000000000000000000000000000000000000000..73c2eb28f7c44db6ed9529247349cac0bf77b049 --- /dev/null +++ b/src/events/RESS/review/looseButtslut.js @@ -0,0 +1,305 @@ +App.Events.RESSLooseButtslut = class RESSLooseButtslut extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + canHold, + canDoAnal, + s => s.fetish === "buttslut" || (s.energy > 95 && s.fetish !== "none"), + s => s.anus > 2, + s => s.belly < 300000, + s => s.rules.release.masturbation === 1, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, himself, girl + } = getPronouns(eventSlave); + const pinches = eventSlave.nipples !== "fuckable" ? "pinches" : "fingers"; + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave); + + let r = []; + r.push( + `Since ${he} has a little free time this evening,`, + contextualIntro(V.PC, eventSlave, "DOM"), + `finds a quiet corner and engages in ${his} anal proclivities. Since ${his} asshole is so stretched out, ${he} sticks the base of a huge dildo to the ground and`); + if (eventSlave.belly >= 100000) { + r.push(`struggles to lower ${his} heavy, very gravid body down onto it,`); + } else if (eventSlave.belly >= 10000) { + r.push(`cautiously lowers ${his}`); + if (eventSlave.bellyFluid >= 10000) { + r.push(`${eventSlave.inflationType}-stuffed`); + } else { + r.push(`very gravid`); + } + r.push(`body on it,`); + } else if (eventSlave.belly >= 5000) { + r.push(`delicately lowers ${his}`); + if (eventSlave.bellyFluid >= 5000) { + r.push(`bloated`); + } else { + r.push(`gravid`); + } + r.push(`body on it,`); + } else { + r.push(`squats on it,`); + } + r.push(`moaning happily as the massive thing inches into ${him}. ${He} starts to slide up and down it`); + if (hasBothArms(eventSlave)) { + r.push(`hands-free,`); + } else { + r.push(`automatically,`); + } + r.push(`so ${he}`); + if (canAchieveErection(eventSlave)) { + if (eventSlave.dick > 5) { + r.push(`jacks off ${his} huge cock with`); + if (hasBothArms(eventSlave)) { + r.push(`both hands.`); + } else { + r.push(`${his} hand.`); + } + } else if (eventSlave.dick > 2) { + r.push(`jacks off with`); + if (!hasBothArms(eventSlave)) { + r.push(`${his} hand.`); + } else { + r.push(`one hand and ${pinches} a nipple with the other.`); + } + } else { + r.push(`rubs ${his} little penis with`); + if (!hasBothArms(eventSlave)) { + r.push(`${his} hand.`); + } else { + r.push(`one hand and ${pinches} a nipple with the other.`); + } + } + } else if (eventSlave.dick > 5) { + r.push(`massages ${his} huge, limp cock with`); + if (hasBothArms(eventSlave)) { + r.push(`both hands.`); + } else { + r.push(`${his} hand.`); + } + } else if (eventSlave.dick > 2) { + r.push(`attempts to jack off ${his} limp dick with`); + if (!hasBothArms(eventSlave)) { + r.push(`${his} hand.`); + } else { + r.push(`one hand while ${eventSlave.nipples !== "fuckable" ? "pinching" : "fingering"} a nipple with the other.`); + } + } else if (eventSlave.dick > 0) { + r.push(`rubs ${his} little penis with`); + if (!hasBothArms(eventSlave)) { + r.push(`${his} hand.`); + } else { + r.push(`one hand and ${pinches} a nipple with the other.`); + } + } else if (eventSlave.vagina === -1) { + r.push(`rubs the sensitive area around ${his} asspussy with`); + if (!hasBothArms(eventSlave)) { + r.push(`${his} hand.`); + } else { + r.push(`one hand and ${pinches} a nipple with the other.`); + } + } else { + r.push(`rubs ${his} clit with`); + if (!hasBothArms(eventSlave)) { + r.push(`${his} hand.`); + } else { + r.push(`one hand and ${pinches} a nipple with the other.`); + } + } + r.push(`As ${he} enjoys ${himself}, ${his} loose sphincter relaxes further until it's barely gripping the dildo.`); + + App.Events.addParagraph(node, r); + App.Events.addResponses(node, [ + new App.Events.Result(`Add something to fill ${him} completely`, completely), + new App.Events.Result(`Let ${him} use a machine`, machine), + (V.HeadGirlID !== 0 && V.HeadGirlID !== eventSlave.ID) + ? new App.Events.Result(`Call your Head Girl in for double anal`, double) + : new App.Events.Result(), + ]); + + function completely() { + r = []; + r.push(`${He}'s so occupied that ${he} doesn't`); + if (canHear(eventSlave)) { + r.push(`hear you`); + } else { + r.push(`sense your presence`); + } + r.push(`until you`); + if (V.PC.dick === 0) { + r.push(`don a strap-on and`); + } + r.push(`tip ${him} over face forward. With ${him} on ${his} knees, ${his} dildo-stuffed ass is in the air; ${he}'s still masturbating between ${his} legs. After a moment's consideration, you slide two exploratory fingers in alongside the dildo. ${He} gasps and masturbates harder. Thus encouraged, you shove`); + if (V.PC.dick === 0) { + r.push(`the strap-on`); + } else { + r.push(`your member`); + } + r.push(`in alongside the dildo.`); + if (eventSlave.voice !== 0) { + r.push(`${He} screams at the surprise double anal, sobbing and begging,`); + } else { + r.push(`${He} screams noiselessly at the surprise double anal, waving ${his} hands in distress,`); + } + r.push(`but ${he} doesn't try to stop you and doggedly keeps rubbing. By the time you're finished ${his} asshole is a gaping hole much bigger than the average pussy. <span class="devotion inc">${He} has become more submissive to you.</span>`); + eventSlave.devotion += 4; + r.push(VCheck.Anal(eventSlave, 1)); + return r; + } + + function machine() { + r = []; + r.push(`There's no reason for ${him} to do that in a quiet corner. You interrupt ${him} and bring ${him} into your office, setting ${him} up on a machine so ${he} can have that dildo rammed up ${his} ass for as long as ${he} likes. Your office is filled with the rhythmic sounds of a sloppy anus being pounded for a good long while.`); + if (V.assistant.personality > 0) { + r.push(`The`); + switch (V.assistant.appearance) { + case "monstergirl": + r.push(`monstrous voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "take my cocks, slave."`); + break; + case "shemale": + r.push(`sultry voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "take my dick, bitch."`); + break; + case "amazon": + r.push(`aggressive voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "be a warrior."`); + break; + case "businesswoman": + r.push(`dominant voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "stop struggling and be a good ${girl}."`); + break; + case "goddess": + case "hypergoddess": + r.push(`calming voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax and accept what you deserve, ${girl}."`); + break; + case "loli": + r.push(`young, naïve voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, it'll get better."`); + break; + case "preggololi": + r.push(`young voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, you know it'll be fun!"`); + break; + case "angel": + r.push(`harmonious voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, it'll be over soon."`); + break; + case "cherub": + r.push(`cheerful voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, it'll feel better if you do!"`); + break; + case "incubus": + r.push(`forceful voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "take my dick, cocksleeve, take it till you split!"`); + break; + case "succubus": + r.push(`sultry voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "enjoy the pounding while it lasts."`); + break; + case "imp": + r.push(`mischievous voice of your assistant's avatar can also be heard, mocking ${eventSlave.slaveName}, "your butthole is going to be so loose after this! You'll be nothing more than a used up whore!"`); + break; + case "witch": + r.push(`uncertain voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "just relax and get it over with."`); + break; + case "ERROR_1606_APPEARANCE_FILE_CORRUPT": + r.push(`unclear voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "scream louder and let it fill your body completely."`); + break; + case "schoolgirl": + r.push(`girly voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "be quiet, or Teacher will hear us."`); + break; + default: + r.push(`poor slave is taken to the very limit by your assistant.`); + } + seX(eventSlave, "anal", "assistant", "penetrative"); + } else { + actX(eventSlave, "anal"); + } + r.push(`By the time ${he}'s climaxed out, ${he}'s so tired and apathetic that ${he} can't bring ${himself} to get off it or ask for help, so ${he} just relaxes and enjoys the internal massage`); + if (eventSlave.dick !== 0) { + r.push(`while ${his} flaccid dick twitches weakly`); + } + r.push(r.pop() + `. <span class="trust inc">${He} has become more trusting of you,</span> since you knew just what ${he} needed.`); + eventSlave.trust += 4; + return r; + } + + function double() { + App.Events.refreshEventArt([eventSlave, S.HeadGirl]); + const { + he2, his2, himself2, He2 + } = getPronouns(S.HeadGirl).appendSuffix("2"); + r = []; + r.push(`When ${S.HeadGirl.slaveName} comes into your office in response to your summons, ${he2} finds ${eventSlave.slaveName} sitting in your lap with your`); + if (V.PC.dick === 0) { + r.push(`strap-on`); + } else { + r.push(`dick`); + } + r.push(`up ${his} gaping`); + if (V.PC.vagina !== -1 && V.PC.dick !== 0) { + r.push(`butt, your bare pussy very visible at the base of your working cock`); + } else { + r.push(`butt.`); + } + r.push(`${S.HeadGirl.slaveName}'s expression softens when ${he2} realizes ${he2}'s here for pleasure, not business. ${eventSlave.slaveName} gasps a little when ${he}`); + if (canHear(eventSlave)) { + r.push(`hears you tell ${S.HeadGirl.slaveName} to join you up ${his} asshole,`); + } else { + r.push(`feels you pull apart ${his} asscheeks to make some room for ${S.HeadGirl.slaveName},`); + } + r.push(`but ${he} doesn't protest.`); + if (eventSlave.chastityPenis === 1) { + r.push(`Since your poor Head Girl can't use ${his2} caged cock, ${he2} takes a dildo and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`); + } else if (canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 7) { + r.push(`Even though your Head Girl is rock-hard and ready to fuck, ${his2} cock is far too large to fit into even the most stretched slave's holes. Sighing, ${he2} takes a dildo and shoves it up ${eventSlave.slaveName}'s already-filled butt instead.`); + } else if (canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 6) { + r.push(`Your lusty Head Girl is already hard and forces ${his2} oversized cock up ${eventSlave.slaveName}'s already-filled butt while`); + if (eventSlave.nipples !== "fuckable") { + r.push(`tweaking`); + } else { + r.push(`fingering`); + } + r.push(`the moaning slave's nipples.`); + } else if ((S.HeadGirl.dick > 0) && (S.HeadGirl.hormoneBalance >= 100)) { + r.push(`Since your poor Head Girl can't get hard due to ${his2} hormone therapy, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`); + } else if ((S.HeadGirl.dick > 0) && (S.HeadGirl.balls > 0) && (S.HeadGirl.ballType === "sterile")) { + r.push(`Since your poor Head Girl can't get hard due to ${his2} chemical castration, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado`); + } else if ((S.HeadGirl.dick > 0) && (S.HeadGirl.balls === 0)) { + r.push(`Since your poor Head Girl can't get hard due to ${his2} orchiectomy, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`); + } else if (!canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 6) { + r.push(`Since your poor Head Girl is far too big to get hard, much to ${eventSlave.slaveName}'s disappointment, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`); + } else if (!canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 0) { + r.push(`Since your poor Head Girl can't get it up for one reason or another, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`); + } else if (S.HeadGirl.dick > 0) { + r.push(`Your lusty Head Girl is already hard and shoves ${himself2} up ${eventSlave.slaveName}'s already-filled butt while`); + if (eventSlave.nipples !== "fuckable") { + r.push(`tweaking`); + } else { + r.push(`fingering`); + } + r.push(`the writhing slave's nipples.`); + } else { + r.push(`${He2} dons a strap-on and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`); + } + r.push(`The two of you jackhammer in and out of ${eventSlave.slaveName}'s ass without mercy; the poor anal whore does ${his} best to relax, but two phalli at once is a lot, even for ${him}. ${He}'s only allowed an anal respite when ${his} sphincter is really fucked out and there's little butthole fun to be had from ${him} any longer. ${He} has become <span class="devotion inc">more submissive to you,</span> and ${S.HeadGirl.slaveName} <span class="devotion inc">enjoyed</span> taking a break to fuck ${him} with you.`); + eventSlave.devotion += 4; + S.HeadGirl.devotion += 4; + seX(eventSlave, "anal", V.PC, "penetrative"); + seX(eventSlave, "anal", S.HeadGirl, "penetrative"); + if (canImpreg(eventSlave, V.PC)) { + knockMeUp(eventSlave, 5, 0, -1); + } + if (canImpreg(eventSlave, S.HeadGirl)) { + knockMeUp(eventSlave, 5, 0, V.HeadGirlID); + } + return r; + } + } +}; diff --git a/src/events/RESS/review/rebelliousArrogant.js b/src/events/RESS/review/rebelliousArrogant.js new file mode 100644 index 0000000000000000000000000000000000000000..3d4d54b4e0933741d50dea85d4a5f2878f0a27d5 --- /dev/null +++ b/src/events/RESS/review/rebelliousArrogant.js @@ -0,0 +1,193 @@ +App.Events.RESSRebelliousArrogant = class RESSRebelliousArrogant extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + s => s.assignment !== Job.QUARTER, + s => s.behavioralFlaw === "arrogant", + s => s.devotion < -50, + s => s.trust >= -50, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + His, He, he, his, him, girl + } = getPronouns(eventSlave); + const belly = bellyAdjective(eventSlave); + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + App.Events.addParagraph(node, [ + `You have a lot of work to do with`, + App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, "DOM"), "."), + `${He} compounds the usual rebellious anger at being a slave with an apparently unshakeable conviction that ${he} is better than you. Oddly, ${he} seems to maintain the idea that enslaving other people is somehow inappropriate, and that having done so has lowered you morally. This morning, ${he} did not appear to start ${his} morning chores as previously ordered. ${He} sleeps on a bedroll: a brief investigation discloses that ${he} is still in it, and has pulled the blanket up over ${his} head. ${He} refuses to acknowledge your peremptory command to get up.` + ]); + + App.Events.addResponses(node, [ + new App.Events.Result(`Force ${him} out of bed and humiliate ${him} publicly`, humiliate, virginityWarning()), + new App.Events.Result(`Let ${him} stay in bed`, stay), + V.seePee === 1 + ? new App.Events.Result(`Let ${him} stay in bed, but move it to a public restroom`, restroom) + : new App.Events.Result(), + (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) + ? new App.Events.Result(`Let ${him} stay in bed, but move it to a whorehouse`, whorehouse, virginityWarning()) + : new App.Events.Result(), + V.arcade > 0 + ? new App.Events.Result(`Sentence ${him} to a month in the arcade`, arcade) + : new App.Events.Result(), + + ]); + + function virginityWarning() { + if ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) { + return `This option will take ${his} virginity`; + } + } + + function humiliate() { + let r = []; + r.push(`You drag ${him} unceremoniously out of bed and straight down into the public areas of ${V.arcologies[0].name}. ${His} struggles and protests grow more frantic as ${he}`); + let textArray = []; + if (canSee(eventSlave)) { + textArray.push(`sees the first passersby beginning to stare at the little spectacle`); + } + if (canHear(eventSlave)) { + textArray.push(`begins to hear the various catcalls and other comments directed at ${him}`); + } else { + textArray.push(`feels the outdoor air on ${his} body`); + } + if (textArray.length === 1) { + r.push(`${textArray[0]}.`); + } else if (textArray.length === 2) { + r.push(`${textArray[0]} and ${textArray[1]}.`); + } else if (textArray.length === 3) { + r.push(`${textArray[0]}, ${textArray[2]} and ${textArray[3]}.`); + } + r.push(`You force ${him} right there, thoroughly raping the struggling ${girl} in public. <span class="trust dec">${He} learns the consequences of refusal,</span>`); + if (V.arcologies[0].FSDegradationist !== "unset") { + r.push(`and <span class="reputation inc">your citizens certainly enjoy the public spectacle.</span>`); + repX(100, "event", eventSlave); + } else { + r.push(`but <span class="reputation dec">your reputation has been decreased by the unseemly commotion.</span>`); + repX(-100, "event", eventSlave); + } + if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) { + r.push(VCheck.Both(eventSlave, 1)); + } else if (canDoVaginal(eventSlave)) { + r.push(VCheck.Vaginal(eventSlave, 1)); + } else if (canDoAnal(eventSlave)) { + r.push(VCheck.Anal(eventSlave, 1)); + } else { + seX(eventSlave, "oral", V.PC, "penetrative"); + } + eventSlave.trust -= 5; + return r; + } + + function stay() { + eventSlave.trust += 10; + eventSlave.devotion -= 10; + return `You shrug and walk out of the room and back to your office; you've got more important things to worry about than some drowsy brat. ${eventSlave.slaveName}, for ${his} part, gets out of bed not long after you leave, but is surprised at <span class="devotion dec">how easily ${he} got away with this,</span> and is wondering <span class="trust inc">what else ${he} could get away with.</span>`; + } + + function restroom() { + eventSlave.trust -= 5; + return `You quickly pin the blanket to the mattress, securing ${him} in place. You direct that a urinal in one of ${V.arcologies[0].name}'s public restrooms be unbolted and replaced by the mattress, slave and all. ${He}'s been swearing and threatening all this time, but the calumny reaches a shrieking crescendo (though muffled by the blanket) when ${he} feels urine beginning to soak through the blanket. After an hour or so ${he}'s begging to be let out, <span class="trust dec">swearing ${he}'ll improve ${his} conduct.</span>`; + } + + function whorehouse() { + let r = []; + r.push(`You quickly pin the blanket to the mattress, securing ${him} in place. You direct that ${he} be brought to an arcology salon that serves as a slave brothel. Once ${he}'s there, you take a pair of scissors and cut a slit through the sheets. ${He}'s been swearing and threatening all this time, but the calumny reaches a shrieking crescendo when ${he} feels a cock being shoved through the slit and between ${his} buttocks. Being muffled and held immobile for rape for hire <span class="trust dec">terrifies ${him}</span> but <span class="cash inc">earns some cash.</span>`); + eventSlave.trust -= 5; + if (canDoVaginal(eventSlave)) { + seX(eventSlave, "vaginal", "public", "penetrative", 5); + if (canDoAnal(eventSlave)) { + seX(eventSlave, "anal", "public", "penetrative", 5); + if (eventSlave.vagina === 0 && eventSlave.anus === 0) { + r.push(`After the patrons have their way with ${him}, <span class="virginity loss">both ${his} pussy and asshole have been broken in.</span> ${He} <span class="devotion dec">hates</span> losing ${his} virginities in such an undignified manner and <span class="trust dec">fears</span> what will be taken from ${him} next.`); + eventSlave.trust -= 5; + eventSlave.devotion -= 5; + eventSlave.vagina++; + eventSlave.anus++; + } else if (eventSlave.vagina === 0) { + r.push(`After the patrons have their way with ${him}, <span class="virginity loss">${he}'s certainly no longer a virgin.</span> ${He} <span class="devotion dec">hates</span> losing ${his} virginity in such an undignified manner and <span class="trust dec">fears</span> what will be taken from ${him} next.`); + eventSlave.trust -= 5; + eventSlave.devotion -= 5; + eventSlave.vagina++; + } else if (eventSlave.anus === 0) { + r.push(`After the patrons have their way with ${him}, <span class="virginity loss">${he}'s certainly no longer an anal virgin.</span> ${He} <span class="devotion dec">hates</span> losing ${his} anal virginity in such an undignified manner and <span class="trust dec">fears</span> what will be taken from ${him} next.`); + eventSlave.trust -= 5; + eventSlave.devotion -= 5; + eventSlave.anus++; + } + if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") { + knockMeUp(eventSlave, 25, 2, -2); + } + } else { + if (eventSlave.vagina === 0) { + r.push(`After the patrons have their way with ${him}, <span class="virginity loss">${he}'s certainly no longer a virgin.</span> ${He} <span class="devotion dec">hates</span> losing ${his} virginity in such an undignified manner and <span class="trust dec">fears</span> what will be taken from ${him} next.`); + eventSlave.trust -= 5; + eventSlave.devotion -= 5; + eventSlave.vagina++; + } + if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") { + knockMeUp(eventSlave, 25, 0, -2); + } + } + } else if (canDoAnal(eventSlave)) { + seX(eventSlave, "anal", "public", "penetrative", 10); + if (eventSlave.anus === 0) { + r.push(`After the patrons have their way with ${him}, <span class="virginity loss">${he}'s certainly no longer an anal virgin.</span> ${He} <span class="devotion dec">hates</span> losing ${his} anal virginity in such an undignified manner and <span class="trust dec">fears</span> what will be taken from ${him} next.`); + eventSlave.trust -= 5; + eventSlave.devotion -= 5; + eventSlave.anus++; + if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") { + knockMeUp(eventSlave, 50, 1, -2); + } + } + } + cashX(100, "event", eventSlave); + return r; + } + + function arcade() { + let r = []; + r.push(`${eventSlave.slaveName} screams and begs when ${he} realizes what ${his} punishment is, but you are obdurate.`); + if (eventSlave.muscles > 30) { + r.push(`${His} powerful form has to be sedated for immurement in the arcade.`); + } else if (eventSlave.weight >= 190) { + r.push(`${He} is so massively fat that immuring ${him} in the arcade is a struggle, even when ${he} isn't trying to.`); + } else if (eventSlave.belly >= 120000) { + r.push(`${He} is so enormously gravid that immuring ${him} in the arcade is a hassle, even though ${his} ${belly} middle limits ${his} ability to struggle.`); + } else if (eventSlave.weight >= -10) { + r.push(`${His} desperate struggles make immuring ${him} in the arcade difficult.`); + } else if (eventSlave.belly >= 1500) { + r.push(`${His} `); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnant`); + } else { + r.push(belly); + } + r.push(` body makes it slightly difficult to fit ${him} properly into the restraints for immurement in the arcade.`); + } else if (eventSlave.muscles < -15) { + r.push(`${His} weak body makes immuring ${him} in the arcade pathetically easy.`); + } else { + r.push(`${His} thin form makes immuring ${him} in the arcade pathetically easy.`); + } + r.push(`After ${he}'s properly confined, the only sign of ${his} discomfiture is a slight movement of ${his} ${eventSlave.skin} butt as ${he} wriggles desperately against ${his} restraints.`); + r.push(assignJob(eventSlave, "be confined in the arcade")); + eventSlave.sentence = 4; + return r; + } + } +}; diff --git a/src/events/RESS/review/resistantGelding.js b/src/events/RESS/review/resistantGelding.js new file mode 100644 index 0000000000000000000000000000000000000000..d682b7f71f966e59c4261ecce58fa5bf0f6f99a5 --- /dev/null +++ b/src/events/RESS/review/resistantGelding.js @@ -0,0 +1,126 @@ +App.Events.RESSResistantGelding = class RESSResistantGelding extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + hasAnyLegs, + s => s.dick > 0, + s => s.balls === 0, + s => s.genes === "XY", + s => s.devotion <= 50, + s => s.trust < -50, + s => s.anus > 0, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him + } = getPronouns(eventSlave); + const {title: Master} = getEnunciation(eventSlave); + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + let r = []; + r.push( + `You come across`, + contextualIntro(V.PC, eventSlave, "DOM"), + `standing in the bathroom in front of the sink, with one leg up on the counter so ${he} can inspect ${his} genitalia.` + ); + if (canSee(eventSlave)) { + r.push(`From the feeds, it's obvious ${he}'s grieved by what ${he} sees.`); + } else { + r.push(`From the feeds, it's obvious ${he}'s grieved by what ${he} feels.`); + } + r.push(`As you watch, ${he} sobs quietly, reaching towards where ${his} scrotum used to be with a trembling hand. Apparently, ${he}'s having trouble accepting ${his} status as a gelded slut.`); + + App.Events.addParagraph(node, r); + App.Events.addResponses(node, [ + new App.Events.Result(`Abuse ${his} ass`, abuse), + new App.Events.Result(`Reassure ${him} of ${his} sexual worth`, reassure), + new App.Events.Result(`Comfort ${him}`, comfort) + ]); + + function abuse() { + r = []; + r.push(`${He} turns around as`); + if (canHear(eventSlave)) { + r.push(`${he} hears`); + } + r.push(`you enter the bathroom, fear and loathing on ${his} face, but you seize ${his} shoulder and spin ${his} back around without a word. You drag ${him} across the counter until ${his} face is over the sink, and turn it on. ${He} struggles in sheer incomprehension as you hold ${his} head over the filling basin with one hand and roughly grope ${his} butt with the other. When the sink is full, you tell ${him} to spread ${his} buttocks for you like a good butthole bitch. ${He} hesitates, so you push ${his} face under the surface of the water and hold it there until ${he} complies. You shove`); + if (V.PC.dick === 0) { + r.push(`a dildo`); + } else { + r.push(`your member`); + } + r.push(`up ${his} anus so harshly that ${he} spasms and reflexively tries to get away, so you push ${him} under again until ${he} stops struggling. For the next ten minutes, ${he} gets shoved under water whenever ${he} offers the slightest resistance to anal rape. Soon, ${his} tears are pattering down into the sink. The next time you decide to buttfuck ${him}, ${he}'s <span class="trust dec">compliant from sheer terror.</span>`); + eventSlave.trust -= 5; + r.push(VCheck.Anal(eventSlave, 1)); + return r; + } + + function reassure() { + r = []; + r.push(`${He} turns around as`); + if (canHear(eventSlave)) { + r.push(`${he} hears`); + } + r.push(`you enter the bathroom, fear and loathing on ${his} face, but is surprised by`); + if (canSee(eventSlave)) { + r.push(`your gentle expression.`); + } else { + r.push(`by how calm your steps seem.`); + } + r.push(`${He}'s more shocked still when you give ${him} a reassuring hug and kiss ${his} unresisting mouth. ${He}'s so unable to figure out what's happening that ${he} eventually gives up and relaxes into you. You gently turn ${him} around to face the mirror again, and working from the top of ${his} head, describe ${his} body in minute detail, explaining how pretty and valuable a sex slave ${he} is. When you're about to reach ${his} butt,`); + if (canTalk(eventSlave)) { + r.push(`${he} uses gestures to beg you not to assrape ${him}.`); + } else { + if (eventSlave.lips > 70) { + r.push(`${he} begs meekly through ${his} massive dick-sucking lips,`); + } else if (eventSlave.lipsPiercing+eventSlave.tonguePiercing > 2) { + r.push(`${he} begs meekly through ${his} mouthful of piercings,`); + } else { + r.push(`${he} begs meekly,`); + } + r.push(Spoken(eventSlave, `"${Master}, please, please don't assrape me. I don't think I can take it."`)); + } + r.push(`You patiently explain that taking`); + if (V.PC.dick === 0) { + r.push(`anything you feel like inserting into ${his} backdoor`); + } else { + r.push(`your cock`); + } + r.push(`is ${his} duty, and begin to massage ${his} sphincter open with a single gentle finger. ${He} doesn't enjoy the ensuing assfuck, but ${he} doesn't truly hate it either and <span class="devotion inc">begins to hope</span> that being your butt slave won't be so painful after all.`); + eventSlave.devotion += 4; + r.push(slaveSkillIncrease('anal', eventSlave, 10)); + r.push(VCheck.Anal(eventSlave, 1)); + return r; + } + + function comfort() { + r = []; + r.push(`${He} turns around as`); + if (canHear(eventSlave)) { + r.push(`${he} hears`); + } + r.push(`you enter the bathroom, fear and loathing on ${his} face, but is surprised by`); + if (canSee(eventSlave)) { + r.push(`your gentle expression.`); + } else { + r.push(`by how calm your steps seem.`); + } + r.push(`${He}'s more shocked still when you give ${him} a reassuring hug and kiss ${his} unresisting mouth. ${He}'s so unable to figure out what's happening that ${he} eventually gives up and relaxes into you. You run your hands along ${his} body and kiss ${his} deeply for a long while before reassuring ${him} of ${his} value to you. ${He} looks confused, but goes about ${his} business with dry eyes. ${He} hates you a little less, but wonders whether ${he} can get away with retaining some independence.`); + return r; + } + } +}; diff --git a/src/events/RESS/review/resistantShower.js b/src/events/RESS/review/resistantShower.js new file mode 100644 index 0000000000000000000000000000000000000000..71e987ebe7f21684cee966b45ad83f7d02591eb2 --- /dev/null +++ b/src/events/RESS/review/resistantShower.js @@ -0,0 +1,192 @@ +App.Events.RESSResistantShower = class RESSResistantShower extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + hasAnyLegs, + s => s.devotion <= 20, + s => s.devotion >= -50, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, himself + } = getPronouns(eventSlave); + const {title: Master} = getEnunciation(eventSlave); + const belly = bellyAdjective(eventSlave); + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + App.Events.addParagraph(node, [ + `Though ${V.assistant.name} constantly monitors all your slaves, you keep an eye on the video feeds yourself. There's nothing like the personal, human touch. You notice one night that`, + contextualIntro(V.PC, eventSlave, "DOM"), + `is crouched in the bottom of the shower. Sensing something amiss, you discreetly investigate, and find that ${he}'s crying quietly under the warm water.` + ]); + + App.Events.addResponses(node, [ + new App.Events.Result(`Enter the shower and quietly comfort ${him}`, comfort), + new App.Events.Result(`Talk through ${his} problems with ${him}`, talk), + (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) + ? new App.Events.Result(`Use ${him} when ${he} gets out`, out, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null) + : new App.Events.Result(), + ]); + + function comfort() { + let r = []; + r.push(`${He} starts with surprise`); + if (canSee(eventSlave)) { + r.push(`as you enter the shower,`); + } else if (canHear(eventSlave)) { + r.push(`as ${he} hears you enter the shower,`); + } else { + r.push(`as ${he} feels the water being disturbed by your body,`); + } + r.push(`and then`); + if (canSee(eventSlave)) { + r.push(`looks at`); + } else { + r.push(`turns to`); + } + r.push(`you in shock as you sit down beside ${him}, ignoring the water soaking your clothes. ${He} does not resist when you draw ${him} gently into your lap. ${He}'s stiff and uncomfortable as you hold ${him} gently, but ${he} eventually relaxes and allows ${his} head to rest`); + if (V.PC.boobs >= 300) { + r.push(`between your breasts.`); + } else { + r.push(`against your shoulder.`); + } + r.push(`${He}'s utterly conflicted; the hateful person who ${he} is expected to fuck is tenderly comforting ${him}. ${He} finally seems to accept the animal comfort, whatever its source, and begins to <span class="trust inc">trust</span> you to do more than just use ${him}.`); + eventSlave.trust += 4; + return r; + } + + function talk() { + const frag = document.createDocumentFragment(); + let r = []; + r.push(`You enter the bathroom and quietly wait until ${he}'s done. When the water shuts off, ${he} stands up absently and spins so the shower's air dry function can blow the water off ${him}. You can't help but notice`); + if (eventSlave.weight > 30) { + r.push(`a lot of motion across ${his}`); + if (eventSlave.weight > 190) { + r.push(`expansive`); + } else if (eventSlave.weight > 130) { + r.push(`fat`); + } else if (eventSlave.weight > 95) { + r.push(`thick`); + } else { + r.push(`chubby`); + } + r.push(`body when the air jets play across ${him}.`); + } else if (eventSlave.belly >= 5000) { + r.push(`how firm ${his} ${belly} belly is.`); + } else if (eventSlave.dick > 1) { + r.push(`${his} soft cock flop around as one of the air jets strikes it.`); + } else if (eventSlave.boobs > 800) { + if ((eventSlave.boobsImplant/eventSlave.boobs) >= .60) { + r.push(`how ${his} fake tits refuse to jiggle under the air jets.`); + } else { + r.push(`how the air jets produce a lot of delectable jiggling when they strike ${his} boobs.`); + } + } else if (eventSlave.butt > 4) { + r.push(`how ${he} has to spread ${his} big buttcheeks to let an air jet dry between them.`); + } else if (eventSlave.labia > 0) { + r.push(`how one of the air jets creates some motion in ${his} generous labia.`); + } else if (eventSlave.muscles > 5) { + r.push(`how the air jets make ${his} taut abs look even more impressive.`); + } else { + r.push(`${his} nipples`); + if (eventSlave.nipples !== "fuckable") { + r.push(`stiffen`); + } else { + r.push(`engorge`); + } + r.push(`under the air jets.`); + } + r.push(`As ${he} rotates,`); + if (canSee(eventSlave)) { + r.push(`${he} notices you with a start and looks concerned, but you do your best to look reassuring and beckon`); + } else { + r.push(`you gently call ${his} name. ${He} jumps at the sound of your voice and looks concerned, but you do your best to calm ${him} and gingerly coax`); + } + r.push(`${him} out of the shower.`); + App.Events.addParagraph(frag, r); + + r = []; + r.push(`You ask ${him} what's troubling ${him}, and the look of concern returns. Suspecting that ${he}'s afraid of telling the truth, you gently encourage ${him} to be honest, and assure ${him} that you're simply taking an interest in ${his} well-being. ${He} still hesitates, but eventually sniffles a little and`); + if (!canTalk(eventSlave)) { + r.push(`reluctantly gestures,`); + } else if (SlaveStatsChecker.checkForLisp(eventSlave)) { + r.push(`lisps,`); + } else { + r.push(`admits,`); + } + if (eventSlave.sexualFlaw === "hates oral" && eventSlave.counter.oral > 0) { + r.push(Spoken(eventSlave, `"It's nothing special, ${Master}. I just h-hate getting facefucked."`)); + } else if (eventSlave.sexualFlaw === "hates anal" && eventSlave.counter.anal > 0) { + r.push(Spoken(eventSlave, `"It's nothing special, ${Master}. I just h-hate getting assraped."`)); + } else if (eventSlave.sexualFlaw === "hates penetration" && eventSlave.counter.vaginal > 0) { + r.push(Spoken(eventSlave, `"It's nothing special, ${Master}. I just h-hate getting fucked."`)); + } else if (eventSlave.behavioralFlaw === "hates women") { + r.push(Spoken(eventSlave, `"Sorry, ${Master}. I just h-hate girls. They're gross."`)); + } else if (eventSlave.behavioralFlaw === "hates men") { + r.push(Spoken(eventSlave, `"Sorry, ${Master}. I just h-hate cocks. I don't want to see another one, ever again."`)); + } else if ((eventSlave.sexualFlaw === "idealistic") && (eventSlave.counter.oral + eventSlave.counter.anal + eventSlave.counter.vaginal + eventSlave.counter.mammary > 0)) { + r.push(Spoken(eventSlave, `"I feel like I'm going crazy, ${Master}. No one here seems to know that rape is wrong. Th-they just r-rape me."`)); + } else if ((eventSlave.sexualFlaw === "shamefast")) { + r.push(Spoken(eventSlave, `"I want to cover myself so badly, ${Master}. I'm so embarrassed all the time. I'm so tired of being embarrassed."`)); + } else if ((eventSlave.sexualFlaw === "repressed") && (eventSlave.counter.oral + eventSlave.counter.anal + eventSlave.counter.vaginal + eventSlave.counter.mammary > 0)) { + r.push(Spoken(eventSlave, `"I'm filthy, ${Master}. I've been used, and I can't ever be clean again. I'm a d-dirty, sinful whore."`)); + } else { + r.push(Spoken(eventSlave, `"Sorry, ${Master}. I was just r-remembering, b-before — all this."`)); + } + r.push(`You tell ${him} kindly that you understand, and that ${he}'ll be trained to address this. Then, you turn and go. ${He}'s mystified; though ${he}'s not overjoyed by the promise of correction, ${he} finds ${himself} <span class="devotion inc">less resistant</span> to following your plans.`); + eventSlave.devotion += 4; + App.Events.addParagraph(frag, r); + return frag; + } + + function out() { + let r = []; + r.push(`Eventually ${he} finishes and switches the shower to dry. The airflow dries ${him} and ${he} steps out, but as ${he} does, ${he}'s seized and flung over the countertop with a slap as ${his} naked, ${eventSlave.skin}`); + if (eventSlave.belly >= 5000) { + r.push(belly); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnant`); + } + r.push(`belly`); + } else { + r.push(`skin`); + } + r.push(`hits the surface.`); + const yourself = V.PC.dick === 0 ? `your vibrating strap-on` : `yourself`; + if (eventSlave.vagina > -1 && !canDoVaginal(eventSlave)) { + r.push(`With ${his} chastity belt protecting ${his} pussy, you ram ${yourself} up ${his} ass instead, drawing a pained sob.`); + } else if (eventSlave.vagina === -1) { + r.push(`You ram ${yourself} up ${his} ass, drawing a pained sob.`); + } else if (!canDoAnal(eventSlave)) { + r.push(`You ram mercilessly into ${his} cunt, forcing a few gasps out of ${him} before it sinks in that this is happening.`); + } else { + r.push(`You take ${his} silly cunt just long enough to force a few gasps out of ${him} before you pull out and ram ${yourself} up ${his} ass, drawing a pained sob.`); + } + r.push(`As ${he} takes the pounding sullenly,`); + if (canSee(eventSlave)) { + r.push(`${he} has a direct view of ${his} own eyes in the mirror, and clearly <span class="trust dec">is disturbed by what ${he} sees.</span>`); + } else if (canHear(eventSlave)) { + r.push(`${he} can hear nothing but the sound of ${his} brutal rape, and clearly <span class="trust dec">is disturbed by what ${he} hears.</span>`); + } else { + r.push(`${his} blindness and deafness mean that one of the few things ${he} can feel is ${his} own rape, which <span class="trust dec">disturbs ${him} to no end.</span>`); + } + eventSlave.trust -= 5; + r.push(VCheck.Both(eventSlave, 1)); + return r; + } + } +}; diff --git a/src/events/RESS/review/sleepingAmbivalent.js b/src/events/RESS/review/sleepingAmbivalent.js new file mode 100644 index 0000000000000000000000000000000000000000..b1a81c27f41cdc0e577b24633e87adcd63193f34 --- /dev/null +++ b/src/events/RESS/review/sleepingAmbivalent.js @@ -0,0 +1,390 @@ +App.Events.RESSSleepingAmbivalent = class RESSSleepingAmbivalent extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + hasAnyLegs, + canTalk, + s => s.devotion <= 20, + s => s.devotion > -10, + s => s.assignment !== Job.QUARTER, + s => s.rules.living === "spare", + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + His, He, he, his, him, girl + } = getPronouns(eventSlave); + const {womanP} = getPronouns(V.PC).appendSuffix("P"); + const {title: Master} = getEnunciation(eventSlave); + const belly = bellyAdjective(eventSlave); + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + App.Events.addParagraph(node, [ + `Passing through the slave dormitory at night, you run your eyes down the row of sleeping chattel. The light here is low, but it's not dark. Slaves need to be able to find the bathroom, slaves on late assignments need to find their beds, and those permitted to do so need to be able to select slaves for sex.`, + contextualIntro(V.PC, eventSlave, "DOM"), + `catches your eye. The dormitory is kept at a pleasant temperature so that the slaves, who of course sleep nude, are comfortable on their bedrolls covered by a single sheet, or nothing at all. ${He} probably went to sleep with ${his} sheet pulled up to ${his} chin, which is normal behavior for slaves who aren't yet accepting of their status as compulsory sex objects, but ${he}'s shrugged it down. Half ${his} torso is bare.` + ]); + let r = []; + r.push(`The dim blue light plays across ${his} ${eventSlave.skin} skin.`); + if (eventSlave.boobs > 2000) { + r.push(`${His} massive boob on that side is slightly shifted by each breath.`); + } else if (eventSlave.boobs > 800) { + r.push(`${His} breast on that side rises and falls with each breath.`); + } else { + r.push(`That side of ${his} chest rises and falls with each breath.`); + } + if (eventSlave.belly >= 5000) { + r.push(`${His} ${belly}`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`pregnant`); + } + r.push(`belly is only partially covered by the sheet, leaving most of it visible.`); + } + r.push(`${He}'s sleeping soundly, ${his} breaths coming deep and slow. Most slaves where ${he} is mentally are troubled by bad dreams, but the poor ${girl} is evidently too tired for that.`); + + App.Events.addParagraph(node, r); + App.Events.addResponses(node, [ + new App.Events.Result(`Grope ${his} boob`, grope), + (eventSlave.belly >= 5000 || eventSlave.weight > 30) + ? new App.Events.Result(`Rub ${his} belly`, rub) + : new App.Events.Result(), + (V.PC.dick !== 0) + ? new App.Events.Result(`Cum on ${his} face`, cum) + : new App.Events.Result(`Squirt on ${his} face`, squirt), + new App.Events.Result(`Just watch ${him} for a little while`, watch), + ]); + + function grope() { + r = []; + r.push(`${His} eyes fly open as ${he} feels someone groping ${him}.`); + if ((eventSlave.boobsImplant/eventSlave.boobs) >= .60) { + r.push(`You're mauling ${his} fake boob, squeezing it and making the skin of ${his} breast, which is already stretched rather taut by the implant, stretch a bit farther.`); + } else if (eventSlave.boobs > 3000) { + r.push(`You're hefting and massaging ${his} mass of breastflesh, playing with ${his}`); + if ((eventSlave.boobsImplant/eventSlave.boobs) < .60) { + r.push(`mostly`); + } + r.push(`natural boob, making ${his} huge soft udder bounce and jiggle.`); + } else if (eventSlave.lactation > 0) { + r.push(`You're kneading and massaging ${his} udder, and the milk begins to`); + if (eventSlave.nipples !== "fuckable") { + r.push(`bead at`); + } else { + r.push(`leak from`); + } + r.push(`the cow's nipple.`); + } else if (eventSlave.boobs > 300) { + r.push(`You've got ${his} whole tit in your hands, jiggling and squeezing the entire thing.`); + } else { + r.push(`You're massaging and squeezing ${his} flat chest.`); + } + r.push(`${His} face contorts with surprise and then outrage, but then ${he}`); + if (!canSee(eventSlave)) { + r.push(`recognizes your familiar`); + if (canSmell(eventSlave)) { + r.push(`smell`); + } else { + r.push(`touch`); + } + r.push(`and`); + } + r.push(`realizes whose hand it is that's taking liberties with ${him}.`); + if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) { + r.push(`Though ${he}'s smart,`); + } else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) { + r.push(`Though ${he}'s not dumb,`); + } else { + r.push(`${He}'s an idiot, and`); + } + r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`); + switch (eventSlave.nipples) { + case "inverted": + r.push(`painfully protruding ${his} fully inverted nipple. ${He} puts up with even that, though ${he} cries a little as it pops out.`); + break; + case "partially inverted": + r.push(`painfully protruding ${his} partially inverted nipple. ${He} puts up with that, too, though ${he} winces as it pops out.`); + break; + case "huge": + r.push(`rolling ${his} huge nipple between a thumb and forefinger, hard enough to hurt. ${He} accepts the mammary abuse.`); + break; + case "fuckable": + r.push(`forcing your entire fist into ${his} nipple. ${He} accepts the stimulation as best ${he} can.`); + break; + default: + r.push(`playing with ${his} nipple, pinching it hard enough to hurt. ${He} accepts the mammary abuse.`); + } + r.push(`Satisfied, you leave ${him} to get back to sleep as best ${he} can.`); + eventSlave.devotion += 4; + if (eventSlave.lactation > 0) { + eventSlave.lactationDuration = 2; + eventSlave.boobs -= eventSlave.boobsMilk; + eventSlave.boobsMilk = 0; + } + return r; + } + + function rub() { + r = []; + if (eventSlave.bellyPreg >= 5000) { + r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly}, life-rounded, stomach.`); + if (eventSlave.weight > 10) { + r.push(`You're massaging and teasing ${his} huge, soft belly.`); + } else if (eventSlave.muscles > 5) { + r.push(`You're massaging and teasing ${his} taut belly and ruined abs.`); + } else { + r.push(`You're massaging and teasing ${his} taut belly.`); + } + r.push(`${His} face contorts with surprise and then outrage, but then ${he}`); + if (!canSee(eventSlave)) { + r.push(`recognizes your familiar`); + if (canSmell(eventSlave)) { + r.push(`smell`); + } else { + r.push(`touch`); + } + r.push(`and`); + } + r.push(`realizes whose hand it is that's taking liberties with ${him}.`); + if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) { + r.push(`Though ${he}'s smart,`); + } else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) { + r.push(`Though ${he}'s not dumb,`); + } else { + r.push(`${He}'s an idiot, and`); + } + r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`); + if (eventSlave.weight > 10) { + r.push(`sinking your hands into ${his} fat to get a good feel of the life growing within.`); + } else { + r.push(`feeling for the life growing within ${him}.`); + } + if (eventSlave.weight > 30) { + r.push(`Though it takes some groping before you are met with a kick from ${his} unborn child.`); + } else if (eventSlave.pregType < 3) { + r.push(`It doesn't take long before you are met with a kick from ${his} unborn child.`); + } else { + r.push(`${He} is so full of children that your ministrations are met with a hail of motion.`); + } + if (eventSlave.pregSource === -1) { + r.push(`Smiling at how active your children are,`); + } else { + r.push(`Satisfied,`); + } + } else if (eventSlave.bellyImplant >= 5000) { + r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly} stomach.`); + if (eventSlave.weight > 10) { + r.push(`You're massaging and teasing ${his} huge, soft belly.`); + } else if (eventSlave.muscles > 5) { + r.push(`You're massaging and teasing ${his} taut belly and ruined abs.`); + } else { + r.push(`You're massaging and teasing ${his} taut belly.`); + } + r.push(`${His} face contorts with surprise and then outrage, but then ${he}`); + if (!canSee(eventSlave)) { + r.push(`recognizes your familiar`); + if (canSmell(eventSlave)) { + r.push(`smell`); + } else { + r.push(`touch`); + } + r.push(`and`); + } + r.push(`realizes whose hand it is that's taking liberties with ${him}.`); + if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) { + r.push(`Though ${he}'s smart,`); + } else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) { + r.push(`Though ${he}'s not dumb,`); + } else { + r.push(`${He}'s an idiot, and`); + } + r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`); + if (eventSlave.weight > 10) { + r.push(`sinking your hands into ${his} fat to get a good feel of the implant hidden within.`); + } else { + r.push(`feeling up the implant within ${him}.`); + } + if (eventSlave.weight > 30) { + r.push(`Though it takes some groping before you locate the firm sphere.`); + } else if (eventSlave.belly < 10000) { + r.push(`It doesn't take long for you to have a solid grip on the firm sphere.`); + } else { + r.push(`It's so huge it's hard to miss, but that just gives you more room to poke and prod at.`); + } + r.push(`Satisfied,`); + } else if (eventSlave.bellyFluid >= 5000) { + r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly}, ${eventSlave.inflationType}-filled stomach.`); + if (eventSlave.weight > 10) { + r.push(`You're massaging and jiggling ${his} huge, soft belly, enjoying the sounds it makes as you move it.`); + } else if (eventSlave.muscles > 5) { + r.push(`You're massaging and jiggling ${his} taut belly and stretched abs, enjoying the sounds it makes as you move it.`); + } else { + r.push(`You're massaging and jiggling ${his} taut belly, enjoying the sounds it makes as you move it.`); + } + r.push(`${His} face contorts with surprise and then outrage, but then ${he}`); + if (!canSee(eventSlave)) { + r.push(`recognizes your familiar`); + if (canSmell(eventSlave)) { + r.push(`smell`); + } else { + r.push(`touch`); + } + r.push(`and`); + } + r.push(`realizes whose hand it is that's taking liberties with ${him}.`); + if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) { + r.push(`Though ${he}'s smart,`); + } else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) { + r.push(`Though ${he}'s not dumb,`); + } else { + r.push(`${He}'s an idiot, and`); + } + r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`); + if (eventSlave.weight > 10) { + r.push(`sinking your hands into ${his} fat to get a good grip`); + } else { + r.push(`wrapping your hands around the sloshing globe`); + } + r.push(`and vigorously shaking. As ${his} gut's groaning from the sudden shift of its contents dies down, you gently apply pressure to the bloated organ, careful to only cause ${his} discomfort and not to disgorge ${his} contents. Satisfied,`); + } else { + r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his}`); + if (eventSlave.weight > 190) { + r.push(`expansive belly. You're massaging and jiggling ${his} obscene gut while teasing ${his} many folds and struggling to find ${his} belly button.`); + } else if (eventSlave.weight > 160) { + r.push(`massive, soft belly. You're massaging and jiggling ${his} obscene gut while teasing ${his} many folds and hidden belly button.`); + } else if (eventSlave.weight > 130) { + r.push(`huge, soft belly. You're massaging and jiggling ${his} thick gut while teasing ${his} folds and hidden belly button.`); + } else if (eventSlave.weight > 95) { + r.push(`big soft belly. You're massaging and jiggling ${his} gut while teasing ${his} folds and hidden belly button.`); + } else { + r.push(`chubby middle. You're massaging and jiggling ${his} tiny gut.`); + } + r.push(`${His} face contorts with surprise and then outrage, but then ${he}`); + if (!canSee(eventSlave)) { + r.push(`recognizes your familiar`); + if (canSmell(eventSlave)) { + r.push(`smell`); + } else { + r.push(`touch`); + } + r.push(`and`); + } + r.push(`realizes whose hand it is that's taking liberties with ${him}.`); + if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) { + r.push(`Though ${he}'s smart,`); + } else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) { + r.push(`Though ${he}'s not dumb,`); + } else { + r.push(`${He}'s an idiot, and`); + } + r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by roughly kneading ${his} pliant flesh, testing how well it can be molded into pleasurable valleys and ravines. Satisfied,`); + } + r.push(`you leave ${him} to get back to sleep as best ${he} can.`); + eventSlave.devotion += 4; + return r; + } + + function cum() { + r = []; + r.push(`You stand over ${him}, quietly masturbating while watching ${him} sleep. Several of ${his} fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You fancy yourself a bit of a marks ${womanP}, and you don't feel the need to bend over ${him} to score good hits. Your load comes in three main jets: the first hits ${him} on the nipple, the second tracks up ${his} sternum and throat, and the third splashes full across ${his} face as ${his} eyes fly open`); + if (V.PC.vagina !== -1) { + r.push(r.pop() + `, each of these accompanied by some less directionally perfect girlcum`); + } + r.push(r.pop() + `. ${He} sputters with surprise and then outrage, but`); + if (!canSee(eventSlave)) { + r.push(`once ${he} recognizes your`); + if (canTaste(eventSlave)) { + r.push(`taste`); + } else { + r.push(`presence`); + } + r.push(`and`); + } else { + r.push(`then ${he}`); + } + r.push(`realizes who it is standing over ${him}`); + if (canSee(eventSlave)) { + r.push(`and`); + } else { + r.push(`does ${he}`); + } + r.push(`<span class="trust dec">freezes in terror.</span>`); + if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) { + r.push(`${He}'s quick, and ${he} immediately realizes`); + } else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) { + r.push(`${He}'s not dumb, and ${he} quickly realizes`); + } else { + r.push(`${He} gradually manages to calculate`); + } + r.push(`that doing anything other than thanking you would be phenomenally stupid. "Thank you, ${Master}," ${he}`); + if (SlaveStatsChecker.checkForLisp(eventSlave)) { + r.push(`lisps`); + } else { + r.push(`mumbles`); + } + r.push(`blearily. You leave ${him} to <span class="devotion inc">puzzle over ${his} own submissiveness,</span> covered in your cum.`); + eventSlave.devotion += 4; + eventSlave.trust -= 2; + return r; + } + + function squirt() { + r = []; + r.push(`You stand over ${him}, quietly masturbating while watching ${him} sleep. Several of ${his} fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You're on excellent terms with your cunt, and you know just what it takes to make yourself squirt. When you feel the heat building just right, you quickly straddle ${his} face without touching ${him}, angling yourself carefully and increasing the pace of your schlicking. In no time at all, a jet of femcum splashes onto ${his} face and down across ${his} chest. ${He} sputters with surprise and then outrage, but then ${he}`); + if (canSee(eventSlave)) { + r.push(`realizes whose pussy ${he}'s staring straight into`); + } else { + r.push(`recognizes your`); + if (canTaste(eventSlave)) { + r.push(`flavor`); + } else { + r.push(`presence`); + } + } + r.push(`and <span class="trust dec">freezes in terror.</span>`); + if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) { + r.push(`${He}'s quick, and ${he} immediately realizes`); + } else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) { + r.push(`${He}'s not dumb, and ${he} quickly realizes`); + } else { + r.push(`${He} gradually manages to calculate`); + } + r.push(`that doing anything other than thanking you would be phenomenally stupid. "Thank you, ${Master}," ${he}`); + if (SlaveStatsChecker.checkForLisp(eventSlave)) { + r.push(`lisps`); + } else { + r.push(`mumbles`); + } + r.push(`blearily. You leave ${him} to <span class="devotion inc">puzzle over ${his} own submissiveness,</span> covered in your pussyjuice.`); + eventSlave.devotion += 4; + eventSlave.trust -= 2; + return r; + } + + function watch() { + const frag = document.createDocumentFragment(); + r = []; + r.push(`You stand there for a while, watching the exhausted slave sleep. It's an oddly restful sight, and the aesthetics of ${his} slumbering little movements hold your attention for a time.`); + if (eventSlave.preg > eventSlave.pregData.normalBirth/2) { + r.push(`You watch the subtle movements going on within ${his} womb as well.`); + } + r.push(`After a while, you head to your own bed. Several of ${his} fellow slaves came and went as you watched ${him}, but if they're surprised by the sight, they have the presence of mind not to show it.`); + App.Events.addParagraph(frag, r); + App.Events.addParagraph(frag, [`One of them quietly lets ${him} know about the incident the next day, though, and the overall impact on ${his} mental state is surprisingly positive. In a more normal human setting, the news that someone watched ${him} sleep last night without ${his} consent or even knowledge at the time would disturb ${him} greatly. However, it's not uncommon for slaves in the dormitory to wake up to the sounds of the occupant of the bedroll next to theirs getting fucked, and without any consent, either. Perhaps you're odd, ${he}'s obviously thinking, but <span class="mediumaquamarine">perhaps you won't rape ${him} while ${he} sleeps.</span>`]); + eventSlave.trust += 4; + return frag; + } + } +}; diff --git a/src/events/RESS/review/soreAss.js b/src/events/RESS/review/soreAss.js new file mode 100644 index 0000000000000000000000000000000000000000..471ef7f471a691384e7193fbddef147acf9d7cfe --- /dev/null +++ b/src/events/RESS/review/soreAss.js @@ -0,0 +1,118 @@ +App.Events.RESSSoreAss = class RESSSoreAss extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + s => s.devotion <= 50, + s => s.minorInjury === "sore ass", + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + His, He, he, his, him, himself + } = getPronouns(eventSlave); + const {title: Master} = getEnunciation(eventSlave); + const belly = bellyAdjective(eventSlave); + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + let r = []; + r.push( + `One night, you see`, + contextualIntro(V.PC, eventSlave, "DOM") + ); + + if (!hasAnyLegs(eventSlave)) { + r.push(`scooting ${himself} from side to side uncomfortably,`); + } else if ((eventSlave.heels === 1 && shoeHeelCategory(eventSlave) === 0)) { + r.push(`crawling gingerly,`); + } else if ((shoeHeelCategory(eventSlave) > 1)) { + r.push(`tottering along painfully,`); + } else { + r.push(`walking a little funny,`); + } + r.push(`as though ${he} has a sore butt. You call ${him} over to inspect ${his} backdoor to see if ${he} needs care,`); + if (!hasAnyLegs(eventSlave)) { + r.push(`and set ${his} helpless body down, spreading ${his} buttocks to examine ${his} anus.`); + } else { + r.push(`and order ${him} to spread ${his} buttocks for you so you can examine ${his} anus.`); + } + r.push(`${His} asshole is fine, just a little sore from hard buttfucks. ${He} complies with you, but as you probe ${him} gently with a finger,`); + if (!canTalk(eventSlave) && (!hasAnyArms(eventSlave))) { + r.push(`${he} wriggles desperately and turns to mouth "it hurts ${getWrittenTitle(eventSlave)} please don't assrape me" at you.`); + } else if (!canTalk(eventSlave)) { + r.push(`${he} gestures desperately, telling you ${his} butt hurts and asking you not to assfuck ${him}.`); + } else { + r.push( + `${he} bursts out,`, + Spoken(eventSlave, `"${Master}, my butt is so sore! Please don't use my ass, ${Master}. Please."`) + ); + } + + App.Events.addParagraph(node, r); + App.Events.addResponses(node, [ + new App.Events.Result(`Punish ${his} ass for insolence`, punish), + new App.Events.Result(`Give ${him} some care`, care), + ]); + + function punish() { + r = []; + r.push(`You inform ${him} sternly that you will ensure that ${he} is not permanently damaged, and that otherwise, ${he} is to take anal pain like a good buttslave. ${He} starts to beg and whine as you lean back in your chair and`); + if (V.PC.dick === 0) { + r.push(`hold ${him} upside down on your chest so ${he} can lick your pussy while you use a dildo on ${his} ass.`); + } else { + r.push(`set ${him} on your chest before reaching around to line your cock up with ${his} sore hole. ${He} shudders and writhes when you start pushing yourself inside.`); + } + r.push(`You use hard pinches to ${his} nipples to punish ${his} whining, forcing ${him} to take a long, painful buttfuck in silence. <span class="gold">${He} has become more afraid of you.</span>`); + if (eventSlave.anus < 3) { + r.push(`${His} week of tough anal experience has <span class="lime">permanently loosened ${his} anus.</span>`); + eventSlave.anus += 1; + } + eventSlave.trust -= 5; + r.push(VCheck.Anal(eventSlave, 1)); + return r; + } + + function care() { + r = []; + r.push(`${He}'s filled with anxiety as you`); + if (eventSlave.belly < 1500) { + r.push(`lay ${him} face-down on your desk,`); + } else { + r.push(`direct ${him} to lay on ${his} side on your desk`); + if (eventSlave.belly >= 300000) { + r.push(`with ${his} ${belly} belly hanging over the edge`); + } + r.push(r.pop() + `,`); + } + r.push(`but is surprised and reassured when ${he}'s penetrated not by a`); + if (V.PC.dick === 0) { + r.push(`strap-on`); + } else { + r.push(`turgid`); + if (V.PC.vagina !== -1) { + r.push(`futa`); + } + r.push(`cock`); + } + r.push(`but by a single gentle finger coated with something healing and cool. The mixed analgesic and anti-inflammatory takes the sharpness off the sore feeling, and will help get ${his} butt back into fucking shape. <span class="trust inc">${He} has become more accepting of anal slavery,</span> and <span class="health inc">${his} asshole feels better.</span>`); + if (eventSlave.anus > 2) { + r.push(`Your expert care has <span class="orange">allowed ${his} loose asspussy to recover a little of its natural shape and size.</span>`); + eventSlave.anus -= 1; + } + eventSlave.trust += 4; + eventSlave.minorInjury = 0; + return r; + } + } +}; diff --git a/src/events/intro/economyIntro.js b/src/events/intro/economyIntro.js index 1615ac57489e69838da30ae43c4474b2f2293ea6..e359c06b05b484a9bd04a678981e0d04f45a48b8 100644 --- a/src/events/intro/economyIntro.js +++ b/src/events/intro/economyIntro.js @@ -57,11 +57,11 @@ App.Intro.economyIntro = function() { r.push(`All the things you need to run your arcology are getting more expensive`); if (V.incomeMod === 0) { r.push(`while all forms of income`); - //<span style="font-weight:Bold">remain static</span>. [[Easier|Economy Intro][V.incomeRate = 1]] + //<span style="font-weight:Bold">remain static.</span> [[Easier|Economy Intro][V.incomeRate = 1]] } else if (V.incomeMod === 1) { - r.push(`while all forms of income <span style="font-weight:Bold">rise but cannot keep pace</span>. [[Easier|Economy Intro][${V.incomeRate} = 2]] | [[Harder|Economy Intro][V.incomeRate = 0]]`); + r.push(`while all forms of income <span style="font-weight:Bold">rise but cannot keep pace.</span> [[Easier|Economy Intro][${V.incomeRate} = 2]] | [[Harder|Economy Intro][V.incomeRate = 0]]`); } else { - r.push(`but luckily all forms of income <span style="font-weight:Bold">rise in lockstep</span>. [[Harder|Economy Intro][${V.incomeRate} = 1]]`); + r.push(`but luckily all forms of income <span style="font-weight:Bold">rise in lockstep.</span> [[Harder|Economy Intro][${V.incomeRate} = 1]]`); } //</div> diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js index c9055aed322d7c485d3d5c0b2758c6d039a51e3c..5518bfc4952ec58a8d1b247ead4dcafff01bde85 100644 --- a/src/events/randomEvent.js +++ b/src/events/randomEvent.js @@ -17,6 +17,7 @@ App.Events.getIndividualEvents = function() { new App.Events.RESSAmpResting(), new App.Events.RESSArcadeSadist(), new App.Events.RESSAssFitting(), + new App.Events.RESSBadDream(), new App.Events.RESSBedSnuggle(), new App.Events.RESSBirthday(), new App.Events.RESSBondageGear(), @@ -24,18 +25,23 @@ App.Events.getIndividualEvents = function() { new App.Events.RESSCockFeederResistance(), new App.Events.RESSComfortableSeat(), new App.Events.RESSCoolerLockin(), + new App.Events.RESSCumslutWhore(), + new App.Events.RESSDesperatelyHorny(), new App.Events.RESSDevotedAnalVirgin(), new App.Events.RESSDevotedEducated(), new App.Events.RESSDevotedFearfulSlave(), new App.Events.RESSDevotedNympho(), + new App.Events.RESSDevotedOld(), new App.Events.RESSDevotedShortstack(), new App.Events.RESSDevotedVirgin(), new App.Events.RESSDevotedWaist(), + new App.Events.RESSDickgirlPC(), new App.Events.RESSEscapee(), new App.Events.RESSForbiddenMasturbation(), new App.Events.RESSFrighteningDick(), new App.Events.RESSHeels(), new App.Events.RESSGaggedSlave(), + new App.Events.RESSHormoneDysfunction(), new App.Events.RESSHotPC(), new App.Events.RESSImpregnationPlease(), new App.Events.RESSImScared(), @@ -44,6 +50,7 @@ App.Events.getIndividualEvents = function() { new App.Events.RESSKitchenMolestation(), new App.Events.RESSLanguageLesson(), new App.Events.RESSLazyEvening(), + new App.Events.RESSLooseButtslut(), new App.Events.RESSMasterfulWhore(), new App.Events.RESSMeanGirls(), new App.Events.RESSMillenary(), @@ -67,7 +74,10 @@ App.Events.getIndividualEvents = function() { new App.Events.RESSPermittedMasturbation(), new App.Events.RESSPlimbHelp(), new App.Events.RESSPlugDisobedience(), + new App.Events.RESSRebelliousArrogant(), new App.Events.RESSRefreshmentDelivery(), + new App.Events.RESSResistantGelding(), + new App.Events.RESSResistantShower(), new App.Events.RESSRestrictedSmart(), new App.Events.RESSPenitent(), new App.Events.RESSRetchingCum(), @@ -77,7 +87,9 @@ App.Events.getIndividualEvents = function() { new App.Events.RESSShiftDoorframe(), new App.Events.RESSSlaveOnSlaveClit(), new App.Events.RESSSlaveOnSlaveDick(), + new App.Events.RESSSleepingAmbivalent(), new App.Events.RESSSolitaryDesperation(), + new App.Events.RESSSoreAss(), new App.Events.RESSSuppositoryResistance(), new App.Events.RESSSurgeryAddict(), new App.Events.RESSTooThinForCumDiet(), diff --git a/src/events/scheduled/burst/burst.js b/src/events/scheduled/burst/burst.js index d5d14df4f79781e56e949a0e9125c3b8ae1cab28..5bd6efbc5d2f9f90ce86a6dd2d2d595d3630133a 100644 --- a/src/events/scheduled/burst/burst.js +++ b/src/events/scheduled/burst/burst.js @@ -10,9 +10,14 @@ App.Events.SEBurst = class SEBurst extends App.Events.BaseEvent { } execute(node) { + const artRenderer = V.seeImages && V.seeReportImages ? new App.Art.SlaveArtBatch(this.actors, 2, 0) : null; + if (artRenderer) { + node.append(artRenderer.writePreamble()); + } + for (const slave of this.actors.map(id => getSlave(id))) { if (slave.womb.length > 0) { - node.append(birth(slave)); + node.append(birth(slave, {artRenderer})); } else { node.append(pop(slave)); } @@ -32,10 +37,8 @@ App.Events.SEBurst = class SEBurst extends App.Events.BaseEvent { He, His, he, his, him } = getPronouns(slave); - if (V.seeImages && V.seeReportImages) { - r.push( - App.UI.DOM.makeElement("div", App.Art.SlaveArtElement(slave, 2, 0), ["imageRef", "medImg"]) - ); + if (artRenderer) { + App.UI.DOM.drawOneSlaveRight(el, slave, artRenderer); } r.push(`As ${slave.slaveName} is going about ${his} business with ${his} overfilled`); if (slave.inflation !== 0) { diff --git a/src/events/schools/resEndowment.js b/src/events/schools/resEndowment.js index 4ef3f188358b1d854370ad8fa251f840aea57ad3..a61b53db698f8419a7938981794441dff88282ca 100644 --- a/src/events/schools/resEndowment.js +++ b/src/events/schools/resEndowment.js @@ -431,13 +431,13 @@ App.Events.RESEndowment = class RESEndowment extends App.Events.BaseEvent { const frag = new DocumentFragment(); let r = []; r.push(`You reconnect the call you had with the first matron, splitting your desktop's display to accommodate both video call windows so that you can address both at once. Then you begin to suggest a compromise that should gratify both parties:`); - App.Events.addParagraph(node, r); + App.Events.addParagraph(frag, r); r = []; r.push(`With their not so feminine voices, conspicuous Adam's apples, dry and barren artificial pussies, and naturally masculine hormonal balances, it is more or less an open secret that Futanari 'Sisters' are all biologically, well, men. It is considered poor taste to mention such a thing among polite company, however, as some men who own futas willfully try to ignore this fact or are otherwise are upset to be reminded of it. Your proposed remedy allows both sisters to have their way: With your extensive funding, those current Sisters who were biologically born male (all of them) will be endowed with bigger balls at the second matron's behest. Meanwhile, a new lineup of biologically female Futanari Sisters will be very rapidly inducted, transformed, cultured, trained, and readied for resale, under the expert leadership of the first matron. These new lady-futas will only have erect dicks to complement their natural fertile pussies, feminine hormones, and soft voices; nary a testicle in sight. Slaveowning society on the other hand will enjoy a wider variety of futanari slaves to choose from, opening up exciting new opportunities for owner to sate their personal preferences and perfect their harems. In 15 weeks, the absolute minimum time that all can be feasibly accomplished, everybody wins. Business will continue as usual in the Futanari Sisters until then, with no immediate change in merchandise.`); - App.Events.addParagraph(node, r); + App.Events.addParagraph(frag, r); r = []; r.push(`"Well, you aren't the first one to think of that." the first matron reluctantly states. "You see, there's this outcast group of Sisters who would be perfect for this, it's just... We haven't seen eye to eye for a long time." The second chimes in: "You could talk her into it, she approves of your build far more than mine. Will probably take several months though, to move them all over and integrate all the new Sisters into our fold, and to enjoy the new pussies, of course." After a moment of consideration, the first agrees. You donate the funds to the Sisters with your compliments, ensuring that neither matron completely controls the vast sum. They both understand what they have to do now, starting immediately.`); - App.Events.addParagraph(node, r); + App.Events.addParagraph(frag, r); r = []; r.push(`Days later, the grateful institution begins a mass marketing campaign all across the world's Free Cities, which includes adverts in FCNN, FCTV, and FC social media about the upcoming changes to their Sister inventory and their need for willing new blood and new specialists to help them bolster their ranks. You feature prominently in each and every promotional item as their foremost contributor. Thanks to this <span class="reputation inc">you will be a household name in the Free Cities for some time.</span> Such a public flex of your financial muscles has also made your relative power very clear to some in the New World, attracting important players who <span class="green">will start to show an interest</span> in doing business with you and your Free City.`); V.TFS.schoolUpgrade = 3; diff --git a/src/facilities/arcade/arcade.js b/src/facilities/arcade/arcade.js index bbe46fb2b50696facd8f02ae874af5148245c4eb..23118203220425406bace710780a24d0497e4eae 100644 --- a/src/facilities/arcade/arcade.js +++ b/src/facilities/arcade/arcade.js @@ -93,24 +93,26 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility { }; } - /** @returns {FC.Facilities.Upgrade[]} */ + /** @returns {FC.IUpgrade[]} */ get upgrades() { return [ { property: "arcadeUpgradeInjectors", - prereqs: [ - () => V.arcadeUpgradeCollectors < 1, - ], tiers: [ { value: 1, base: `It is a standard arcade. It can be upgraded to either maximize the pleasure of those that visit it at the expense of the health of the inmates, or to keep them healthy (if not happy) and milk them of useful fluids.`, link: `Upgrade the arcade with invasive performance-enhancing systems`, cost: 10000 * V.upgradeMultiplierArcology, - handler: () => V.PC.skill.engineering += .1, + handler: () => { + V.PC.skill.engineering += .1; + + App.UI.reload(); + }, note: `, increases upkeep costs, and is mutually exclusive with the collectors`, prereqs: [ () => V.arcadeUpgradeInjectors < 1, + () => V.arcadeUpgradeCollectors < 1, ], }, { @@ -118,58 +120,75 @@ App.Facilities.Arcade.arcade = class Arcade extends App.Facilities.Facility { base: `It has been upgraded with electroshock applicators. Whether they're enjoying themselves or not is irrelevant; they are shocked to tighten their holes regardless. You may also apply aphrodisiacs to further enhance performance.`, upgraded: `It has been upgraded with aphrodisiac injection systems and electroshock applicators. If the aphrodisiacs fail to force an orgasm from an inmate, they are shocked to tighten their holes regardless.`, link: `Apply aphrodisiacs`, - handler: () => V.PC.skill.engineering += .1, + handler: () => { + V.PC.skill.engineering += .1; + + App.UI.reload(); + }, prereqs: [ () => V.arcadeUpgradeInjectors > 0, + () => V.arcadeUpgradeCollectors < 1, ], }, ], }, { property: "arcadeUpgradeCollectors", - prereqs: [ - () => V.arcadeUpgradeInjectors < 1, - ], tiers: [ { value: 1, upgraded: `It has been retrofitted to milk lactating slaves${V.seeDicks !== 0 ? ` and cockmilk slaves capable of ejaculating` : ``}, though less efficiently than a dedicated facility.`, link: `Retrofit the arcade to collect useful fluids`, cost: 10000 * V.upgradeMultiplierArcology, - handler: () => V.PC.skill.engineering += .1, + handler: () => { + V.PC.skill.engineering += .1; + + App.UI.reload(); + }, note: `, increases upkeep costs, and is mutually exclusive with the injectors`, + prereqs: [ + () => V.arcadeUpgradeInjectors < 1, + ], }, ], }, { property: "arcadeUpgradeHealth", - prereqs: [ - () => V.arcadeUpgradeHealth < 0, - ], tiers: [ { value: 1, base: `The arcade can be upgraded to include curative injectors in order to keep inmates from succumbing under the harsh treatment. You are assured the inmates won't like their time in the arcade any better; it is purely intended to keep them functional and ready for use around the clock. It comes equipped with two settings.`, link: `Install curative injectors`, cost: 10000 * V.upgradeMultiplierArcology, - handler: () => V.PC.skill.engineering += .1, + handler: () => { + V.PC.skill.engineering += .1; + + App.UI.reload(); + }, note: ` and will increase upkeep costs`, + prereqs: [ + () => V.arcadeUpgradeHealth < 0, + ], }, ], }, { property: "arcadeUpgradeFuckdolls", - prereqs: [ - () => V.arcadeUpgradeFuckdolls === 0, - ], tiers: [ { value: 1, base: `${capFirstChar(V.arcadeName)} is not equipped to convert inmates into standard Fuckdolls.`, link: `Upgrade the arcade to create Fuckdolls`, cost: 5000 * V.upgradeMultiplierArcology, - handler: () => V.PC.skill.engineering += .1, + handler: () => { + V.PC.skill.engineering += .1; + + App.UI.reload(); + }, note: ` and will increase upkeep costs`, + prereqs: [ + () => V.arcadeUpgradeFuckdolls === 0, + ], }, ], }, diff --git a/src/facilities/brothel/brothel.js b/src/facilities/brothel/brothel.js index 0e6e542f0f75e9d2520f4bc7ba28b2c3ffc1dd91..8606ad827531cfdfd965aa6acca96cb5591500ec 100644 --- a/src/facilities/brothel/brothel.js +++ b/src/facilities/brothel/brothel.js @@ -134,14 +134,11 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility { }; } - /** @returns {FC.Facilities.Upgrade[]}*/ + /** @returns {FC.IUpgrade[]}*/ get upgrades() { return [ { property: "brothelUpgradeDrugs", - prereqs: [ - () => V.brothelUpgradeDrugs === 0, - ], tiers: [ { value: 1, @@ -150,6 +147,9 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility { cost: 10000 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier, handler: () => V.PC.skill.engineering += .1, note: ` and will increase upkeep costs`, + prereqs: [ + () => V.brothelUpgradeDrugs === 0, + ], }, ], }, diff --git a/src/facilities/cellblock/cellblock.js b/src/facilities/cellblock/cellblock.js index 6eef8d1108d46f396230d606575ab85fe3500610..68436c3dd3935507c8a9b460d2f1028ee398c7da 100644 --- a/src/facilities/cellblock/cellblock.js +++ b/src/facilities/cellblock/cellblock.js @@ -91,12 +91,11 @@ App.Facilities.Cellblock.cellblock = class Cellblock extends App.Facilities.Faci }; } - /** @returns {FC.Facilities.Upgrade[]} */ + /** @returns {FC.IUpgrade[]} */ get upgrades() { return [ { property: "cellblockUpgrade", - prereqs: [], tiers: [ { value: 1, diff --git a/src/facilities/clinic/clinic.js b/src/facilities/clinic/clinic.js index 1024184500fe4c385db567999e300f0e8b4ad882..ea5cab998a3fe0e3215ee61508ddc81ac8a6955d 100644 --- a/src/facilities/clinic/clinic.js +++ b/src/facilities/clinic/clinic.js @@ -92,12 +92,11 @@ App.Facilities.Clinic.clinic = class Clinic extends App.Facilities.Facility { }; } - /** @returns {FC.Facilities.Upgrade[]} */ + /** @returns {FC.IUpgrade[]} */ get upgrades() { return [ { property: "clinicUpgradeScanner", - prereqs: [], tiers: [ { value: 1, @@ -109,9 +108,9 @@ App.Facilities.Clinic.clinic = class Clinic extends App.Facilities.Facility { note: ` and increases the effectiveness of ${V.clinicName}`, }, ], - }, { + }, + { property: "clinicUpgradeFilters", - prereqs: [], tiers: [ { value: 1, @@ -123,11 +122,9 @@ App.Facilities.Clinic.clinic = class Clinic extends App.Facilities.Facility { note: ` and increases the effectiveness of ${V.clinicName}`, }, ], - }, { + }, + { property: "clinicUpgradePurge", - prereqs: [ - () => V.clinicUpgradeFilters > 0, - ], tiers: [ { value: 1, @@ -137,6 +134,7 @@ App.Facilities.Clinic.clinic = class Clinic extends App.Facilities.Facility { handler: () => V.PC.skill.hacking += 0.1, note: ` and may cause health problems in slaves`, prereqs: [ + () => V.clinicUpgradeFilters > 0, () => V.clinicUpgradePurge < 1, ], }, diff --git a/src/facilities/club/club.js b/src/facilities/club/club.js index 079cf29e539778440955a8f67b194fd009ca114c..c05c8034aaf936b5ec5218c623b690da90d8bd30 100644 --- a/src/facilities/club/club.js +++ b/src/facilities/club/club.js @@ -261,12 +261,11 @@ App.Facilities.Club.club = class Club extends App.Facilities.Facility { }; } - /** @returns {FC.Facilities.Upgrade[]} */ + /** @returns {FC.IUpgrade[]} */ get upgrades() { return [ { property: "clubUpgradePDAs", - prereqs: [], tiers: [ { value: 1, diff --git a/src/facilities/dairy/freeRangeDairyAssignmentScene.js b/src/facilities/dairy/freeRangeDairyAssignmentScene.js index c22b6a839e67e14ff390ce683f935e74c627b27c..21e57308ec483ecea14cf0b98a8125c849381324 100644 --- a/src/facilities/dairy/freeRangeDairyAssignmentScene.js +++ b/src/facilities/dairy/freeRangeDairyAssignmentScene.js @@ -10,9 +10,7 @@ App.Facilities.Dairy.freeRangeAssignmentScene = function(slave) { he, him, his, himself } = getPronouns(slave); - if (V.seeImages) { - App.UI.DOM.appendNewElement("div", node, App.Art.SlaveArtElement(slave, 2, 0), ["imageRef", "medImg"]); - } + App.UI.DOM.drawOneSlaveRight(node, slave); r.push(`${slave.slaveName} reports to the dairy.`); if (slave.energy > 90 ) { @@ -65,9 +63,7 @@ App.Facilities.Dairy.freeRangeAssignmentScene = function(slave) { he2, his2, him2, } = getPronouns(cow).appendSuffix("2"); aroused = true; - if (V.seeImages) { - App.UI.DOM.appendNewElement("div", node, App.Art.SlaveArtElement(cow, 2, 0), ["imageRef", "medImg"]); - } + App.UI.DOM.drawOneSlaveRight(node, cow); r.push(`The hyper-endowed cum-cow ${cow.slaveName} is the pride of ${V.dairyName}. ${He2} is limply hanging on ${his2} milking chair, panting heavily because of the constant suction on ${his2} dick. ${He2} is obviously nearing climax. Soon,`); if (hasAnyNaturalEyes(cow)) { r.push(his2); @@ -162,17 +158,13 @@ App.Facilities.Dairy.freeRangeAssignmentScene = function(slave) { const { He2 } = getPronouns(assayedSlave).appendSuffix("2"); - if (V.seeImages === 1) { - App.UI.DOM.appendNewElement("div", node, App.Art.SlaveArtElement(assayedSlave, 2, 0), ["imageRef", "medImg"]); - } + App.UI.DOM.drawOneSlaveRight(node, assayedSlave); r.push(`${His} ${assayType} ${assayedSlave.slaveName} is at the dairy, too. ${He2} is in the adjacent stall. The two of them are going to be milked right next to each other.`); } App.Events.addParagraph(node, r); r = []; - if (S.Milkmaid && V.seeImages === 1) { - App.UI.DOM.appendNewElement("div", node, App.Art.SlaveArtElement(S.Milkmaid, 2, 0), ["imageRef", "medImg"]); - } + App.UI.DOM.drawOneSlaveRight(node, S.Milkmaid); r.push(`The only "furniture" in the stall looks like a dentist's chair. Despite the medical appearance, when ${he}`); if (slave.devotion > 90) { r.push(`eagerly`); diff --git a/src/facilities/farmyard/farmyard.js b/src/facilities/farmyard/farmyard.js index 7de1c998c4efddbe03b113d7be60809c89e359b0..3de4088de3242efd01390a8d85893508c8c24fc8 100644 --- a/src/facilities/farmyard/farmyard.js +++ b/src/facilities/farmyard/farmyard.js @@ -131,12 +131,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit }; } - /** @returns {FC.Facilities.Upgrade[]} */ + /** @returns {FC.IUpgrade[]} */ get upgrades() { return [ { property: "pump", - prereqs: [], tiers: [ { value: 1, @@ -144,7 +143,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit upgraded: `The water pump in ${V.farmyardName} is a more efficient model, slightly improving the amount of crops it produces.`, link: `Upgrade the water pump`, cost: Math.trunc(5000 * V.upgradeMultiplierArcology), - handler: () => V.PC.skill.engineering += 0.1, + handler: () => { + V.PC.skill.engineering += 0.1; + + App.UI.reload(); + }, note: ` and slightly decreases upkeep costs`, }, ], @@ -152,68 +155,84 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit }, { property: "fertilizer", - prereqs: [ - () => V.farmyardUpgrades.pump > 0, - ], tiers: [ { value: 1, upgraded: `${this.facility.nameCaps} is using a higher-quality fertilizer, moderately increasing the amount of crops it produces and slightly raising upkeep costs.`, link: `Use a higher-quality fertilizer`, cost: Math.trunc(10000 * V.upgradeMultiplierArcology), - handler: () => V.PC.skill.engineering += 0.1, + handler: () => { + V.PC.skill.engineering += 0.1; + + App.UI.reload(); + }, note: `, moderately increases crop yield, and slightly increases upkeep costs`, + prereqs: [ + () => V.farmyardUpgrades.pump > 0, + ], }, ], object: V.farmyardUpgrades, }, { property: "hydroponics", - prereqs: [ - () => V.farmyardUpgrades.fertilizer > 0, - ], tiers: [ { value: 1, upgraded: `${this.facility.nameCaps} is outfitted with an advanced hydroponics system, reducing the amount of water your crops consume and thus moderately reducing upkeep costs.`, link: `Purchase an advanced hydroponics system`, cost: Math.trunc(20000 * V.upgradeMultiplierArcology), - handler: () => V.PC.skill.engineering += 0.1, + handler: () => { + V.PC.skill.engineering += 0.1; + + App.UI.reload(); + }, note: ` and moderately decreases upkeep costs`, + prereqs: [ + () => V.farmyardUpgrades.fertilizer > 0, + ], }, ], object: V.farmyardUpgrades, }, { property: "seeds", - prereqs: [ - () => V.farmyardUpgrades.hydroponics > 0, - ], tiers: [ { value: 1, upgraded: `${this.facility.nameCaps} is using genetically modified seeds, significantly increasing the amount of crops it produces and moderately increasing upkeep costs.`, link: `Purchase genetically modified seeds`, cost: Math.trunc(25000 * V.upgradeMultiplierArcology), - handler: () => V.PC.skill.engineering += 0.1, + handler: () => { + V.PC.skill.engineering += 0.1; + + App.UI.reload(); + }, note: `, moderately increases crop yield, and slightly increases upkeep costs`, + prereqs: [ + () => V.farmyardUpgrades.hydroponics > 0, + ], }, ], object: V.farmyardUpgrades, }, { property: "machinery", - prereqs: [ - () => V.farmyardUpgrades.seeds > 0, - ], tiers: [ { value: 1, upgraded: `The machinery in ${V.farmyardName} has been upgraded and is more efficient, significantly increasing crop yields and significantly decreasing upkeep costs.`, link: `Upgrade the machinery`, cost: Math.trunc(50000 * V.upgradeMultiplierArcology), - handler: () => V.PC.skill.engineering += 0.1, + handler: () => { + V.PC.skill.engineering += 0.1; + + App.UI.reload(); + }, note: `, moderately increases crop yield, and slightly increases upkeep costs`, + prereqs: [ + () => V.farmyardUpgrades.seeds > 0 + ], }, ], object: V.farmyardUpgrades, diff --git a/src/facilities/masterSuite/masterSuite.js b/src/facilities/masterSuite/masterSuite.js index 785e5a31f0dbc7247a6f43c240ee925012802246..f267652e9c420ecf0f6e94304a626c259303676c 100644 --- a/src/facilities/masterSuite/masterSuite.js +++ b/src/facilities/masterSuite/masterSuite.js @@ -260,12 +260,11 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie }; } - /** @returns {FC.Facilities.Upgrade[]} */ + /** @returns {FC.IUpgrade[]} */ get upgrades() { return [ { property: "masterSuiteUpgradeLuxury", - prereqs: [], tiers: [ { value: 1, @@ -292,9 +291,6 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie }, { property: "masterSuiteUpgradePregnancy", - prereqs: [ - () => !!V.seePreg, - ], tiers: [ { value: 2, @@ -303,6 +299,9 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie link: `Refit the suite to support and encourage slave pregnancy`, cost: 15000 * V.upgradeMultiplierArcology, handler: () => V.PC.skill.engineering += .1, + prereqs: [ + () => !!V.seePreg, + ], }, ], }, diff --git a/src/facilities/salon/salonPassage.js b/src/facilities/salon/salonPassage.js index c6d257eb7c3561b331f86f9bd422a48b5ea856dc..613f26197664ab7096a6c606a9d688d774d6c5c2 100644 --- a/src/facilities/salon/salonPassage.js +++ b/src/facilities/salon/salonPassage.js @@ -59,11 +59,17 @@ App.UI.salon = function(slave, cheat = false) { .addValue("Cosmetic glasses", "glasses", billMod); if (getBestVision(slave) !== 0 && anyVisionEquals(slave, 1)) { option.addValue("Corrective glasses", "corrective glasses", billMod); - option.addValue("Corrective contacts", "corrective contacts", billMod); + if (hasAnyEyes(slave)) { + option.addValue("Corrective contacts", "corrective contacts", billMod); + } } else { option.addValue("Blurring glasses", "blurring glasses", billMod); - option.addValue("Blurring contacts", "blurring contacts", billMod); - option.addComment("Blurring options are annoying and impede performance on some assignments."); + if (hasAnyEyes(slave)) { + option.addValue("Blurring contacts", "blurring contacts", billMod); + } + if (getBestVision(slave) !== 0) { + option.addComment("Blurring options are annoying and impede performance on some assignments."); + } } el.append(options.render()); diff --git a/src/facilities/schoolroom/schoolroom.js b/src/facilities/schoolroom/schoolroom.js index 52c2298d98bfa348f37f3cd330adeea5abae349f..f9f5a9ba3a3d966aeb87f0de69ae081e761a2843 100644 --- a/src/facilities/schoolroom/schoolroom.js +++ b/src/facilities/schoolroom/schoolroom.js @@ -92,12 +92,11 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F }; } - /** @returns {FC.Facilities.Upgrade[]} */ + /** @returns {FC.IUpgrade[]} */ get upgrades() { return [ { property: "schoolroomUpgradeSkills", - prereqs: [], tiers: [ { value: 1, @@ -111,7 +110,6 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F }, { property: "schoolroomUpgradeLanguage", - prereqs: [], tiers: [ { value: 1, @@ -125,9 +123,6 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F }, { property: "schoolroomRemodelBimbo", - prereqs: [ - () => V.arcologies[0].FSIntellectualDependency > 80, - ], tiers: [ { value: 1, @@ -136,6 +131,9 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F link: `Redesign the curriculum to undo pesky educations and retard slaves while benefiting the most simple of minds`, cost: 7500 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier, handler: () => V.schoolroomUpgradeRemedial = 0, + prereqs: [ + () => V.arcologies[0].FSIntellectualDependency > 80, + ], }, { value: 0, @@ -144,13 +142,14 @@ App.Facilities.Schoolroom.schoolroom = class Schoolroom extends App.Facilities.F link: `Restore the curriculum to the standard`, cost: 7500 * V.upgradeMultiplierArcology * V.HackingSkillMultiplier, handler: () => V.schoolroomUpgradeRemedial = 0, + prereqs: [ + () => V.arcologies[0].FSIntellectualDependency > 80, + ], }, ], - }, { property: "schoolroomUpgradeRemedial", - prereqs: [], tiers: [ { value: 1, diff --git a/src/facilities/servantsQuarters/servantsQuarters.js b/src/facilities/servantsQuarters/servantsQuarters.js index f5a053165c50b412d503015773576f17eed0c8b4..3fb0b7267e1f50d153b3d50a1aa9feb3b17c7226 100644 --- a/src/facilities/servantsQuarters/servantsQuarters.js +++ b/src/facilities/servantsQuarters/servantsQuarters.js @@ -89,12 +89,11 @@ App.Facilities.ServantsQuarters.servantsQuarters = class ServantsQuarters extend }; } - /** @returns {FC.Facilities.Upgrade[]} */ + /** @returns {FC.IUpgrade[]} */ get upgrades() { return [ { property: "servantsQuartersUpgradeMonitoring", - prereqs: [], tiers: [ { value: 1, diff --git a/src/facilities/spa/spa.js b/src/facilities/spa/spa.js index e886e959a3959b5e1c5e672a6ad80c2dd04f9a19..1b5f78fbd20538c0b0f4ea297a1d4b3fd0c3b723 100644 --- a/src/facilities/spa/spa.js +++ b/src/facilities/spa/spa.js @@ -94,12 +94,11 @@ App.Facilities.Spa.spa = class Spa extends App.Facilities.Facility { }; } - /** @returns {FC.Facilities.Upgrade[]} */ + /** @returns {FC.IUpgrade[]} */ get upgrades() { return [ { property: "spaUpgrade", - prereqs: [], tiers: [ { value: 1, @@ -108,9 +107,9 @@ App.Facilities.Spa.spa = class Spa extends App.Facilities.Facility { link: `Upgrade ${V.spaName} with saunas, steam rooms, and mineral water baths`, cost: 1000 * V.upgradeMultiplierArcology, note: ` and increases the effectiveness of ${V.spaName}`, - }, + } ], - } + }, ]; } diff --git a/src/gui/mainMenu/AlphaDisclaimer.js b/src/gui/mainMenu/AlphaDisclaimer.js index 2331346dd71a29e9600ea636e26f649add10cc8f..becd267a2b3191a331d3fbe60ca91627b999884c 100644 --- a/src/gui/mainMenu/AlphaDisclaimer.js +++ b/src/gui/mainMenu/AlphaDisclaimer.js @@ -17,13 +17,16 @@ App.Intro.alphaDisclaimer = function() { ]); App.UI.DOM.appendNewElement("h2", node, "Please note"); - App.Events.addParagraph(node, [ + const p = App.UI.DOM.appendNewElement("p", node); + App.Events.addNode(p, [ App.UI.DOM.makeElement("span", `This is an alpha.`, "bold"), - `That means the game is missing content, is full of bugs, is imbalanced, and is generally in an incomplete state. The game will keep a start of turn autosave. If you encounter a bug, we strongly recommend you reload your start of turn autosave immediately. Please submit your feedback and bug reports at https://gitgud.io/pregmodfan/fc-pregmod/issues/. Consider attaching a save file and screenshot of the problem.`, - App.UI.DOM.makeElement("div", App.Events.makeNode([`Pregmod is a modification of the original <i>Free Cities</i> created by FCdev, which can be seen at https://freecitiesblog.blogspot.com/.`])), - App.UI.DOM.makeElement("div", `version: ${V.ver}, mod version: ${V.pmodVer}, build: ${V.releaseID}${App.Version.commitHash ? `, commit: ${App.Version.commitHash}` : ``}`, "note"), - App.UI.DOM.makeElement("div", `4.0.0 is an alpha release. This means the new player content has minimal implementation.`, "bold"), /* remove me with 4.0.0! */ - ]); + `That means the game is missing content, is full of bugs, is imbalanced, and is generally in an incomplete state. The game will keep a start of turn autosave. If you encounter a bug, we strongly recommend you reload your start of turn autosave immediately. Please submit your feedback and bug reports <a href='https://gitgud.io/pregmodfan/fc-pregmod/issues/' target='_blank'>here</a>. Consider attaching a save file and screenshot of the problem.`, + ], "div"); + App.Events.addNode(p, [`Pregmod is a modification of the original <i>Free Cities</i> ${V.ver} created by FCdev, which can be seen <a href='https://freecitiesblog.blogspot.com/' target='_blank'>here</a>.`], "div"); + + + App.Events.addNode(p, [`mod version: ${V.pmodVer}, build: ${V.releaseID}${App.Version.commitHash ? `, commit: ${App.Version.commitHash}` : ``}`], "div", "note"); + App.Events.addNode(p, [`4.0.0 is an alpha release. This means the new player content has minimal implementation.`], "div", "bold"); /* remove me with 4.0.0! */ App.Events.addResponses(node, [ new App.Events.Result(`More version info`, versionInfo) @@ -39,10 +42,10 @@ App.Intro.alphaDisclaimer = function() { function versionInfo() { const frag = new DocumentFragment(); - App.Events.addParagraph(frag, [ + App.Events.addNode(frag, [ App.UI.DOM.makeElement("span", "Mod: expanded age ranges and other tweaks 2016-08-30", ["green", "note"]), App.UI.DOM.makeElement("span", `+SV`, "darkred"), - ]); + ], "div"); App.UI.DOM.appendNewElement("div", frag, "Mod: extra preg content and other crap", ["green", "note"]); App.UI.DOM.appendNewElement("div", frag, "Saves from versions prior to 0.6 are not compatible.", "bold"); diff --git a/src/gui/options/options.js b/src/gui/options/options.js index c6404e089f41bf72d1a7b6710344340910236e20..3fc9ed2dcd3d682eb0507ffa842470b02ca434cd 100644 --- a/src/gui/options/options.js +++ b/src/gui/options/options.js @@ -1125,6 +1125,11 @@ App.UI.artOptions = function() { options.addOption("Face culling", "setFaceCulling") .addValue("Enabled", true).off().addValue("Disabled", false).on() .addComment("Wether to draw the backside of the model, affects transparent surfaces such as hair. Enabling is recommended for low-end GPU's."); + options.addOption("Texture resolution", "setTextureResolution") + .addValue("1024", 1024).on().addValue("2048", 2048).off().addValue("4096", 4096).off() + .addComment("Refresh the page to take affect."); + options.addOption("Color burn", "setColorBurn") + .addValue("Enabled", true).on().addValue("Disabled", false).off(); } options.addOption("PA avatar art is", "seeAvatar") diff --git a/src/js/birth/birth.js b/src/js/birth/birth.js index dbd4c00a620b2a48d03a41fb185f3a832df6ff05..fab3eb3645bc727c429875c081b03a57fa6f993e 100644 --- a/src/js/birth/birth.js +++ b/src/js/birth/birth.js @@ -10,8 +10,13 @@ App.Events.SEBirth = class SEBirth extends App.Events.BaseEvent { } execute(node) { + const artRenderer = V.seeImages && V.seeReportImages ? new App.Art.SlaveArtBatch(this.actors, 2, 0) : null; + if (artRenderer) { + node.append(artRenderer.writePreamble()); + } + for (const slave of this.actors.map(id => getSlave(id))) { - node.append(birth(slave)); + node.append(birth(slave, {artRenderer})); node.append(sectionBreak()); } V.birthIDs = []; @@ -32,8 +37,9 @@ App.Events.SEBirth = class SEBirth extends App.Events.BaseEvent { * @param {object} [obj] * @param {boolean} [obj.birthStorm] * @param {boolean} [obj.cSection] + * @param {App.Art.SlaveArtBatch} [obj.artRenderer] */ -globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {}) { +globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRenderer = null} = {}) { const el = document.createElement("p"); el.style.overflow = "hidden"; // Keep image from floating into the next slave. let p; @@ -59,8 +65,8 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {}) he, his, him, himself, wife, girl } = getPronouns(slave); const hands = (hasBothArms(slave)) ? "hands" : "hand"; - if (V.seeImages && V.seeReportImages) { - App.UI.DOM.appendNewElement("div", el, App.Art.SlaveArtElement(slave, 2), ["imageRef", "medImg"]); + if (artRenderer) { + App.UI.DOM.drawOneSlaveRight(el, slave, artRenderer); } el.append(titleText()); suddenBirthCheck(); diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js index 260dbdc368fc277dd72f4e26be28894f6feabdab..ba91c31f00c6b6e3bbc786f9793cf476c4dd98c3 100644 --- a/src/js/eventSelectionJS.js +++ b/src/js/eventSelectionJS.js @@ -57,17 +57,6 @@ globalThis.generateRandomEventPool = function(eventSlave) { } if (eventSlave.assignment !== Job.QUARTER) { - if (eventSlave.rules.living === "spare") { - if (eventSlave.devotion <= 20) { - if (eventSlave.devotion > -10) { - V.RESSevent.push("sleeping ambivalent"); - } - if (eventSlave.trust < -20) { - V.RESSevent.push("bad dream"); - } - } - } - if (eventSlave.devotion <= 50) { if (eventSlave.devotion >= -20) { if (eventSlave.weekAcquired > 0) { @@ -215,18 +204,6 @@ if(eventSlave.drugs === "breast injections") { } } - if (eventSlave.devotion > 50) { - if (eventSlave.trust > 20) { - if (eventSlave.physicalAge > 37) { - if (eventSlave.anus > 0) { - if (eventSlave.vagina > 0) { - V.RESSevent.push("devoted old"); - } - } - } - } - } - if (eventSlave.fetish === "humiliation" || eventSlave.energy > 95) { if (eventSlave.devotion <= 50) { if (eventSlave.devotion >= -20) { @@ -463,20 +440,6 @@ if(eventSlave.drugs === "breast injections") { } } - if (V.PC.dick > 0) { - if (V.PC.boobs >= 300) { - if (canSee(eventSlave)) { - if (eventSlave.devotion <= 50) { - if (eventSlave.devotion >= -20) { - if (((eventSlave.attrXY <= 35) && (eventSlave.attrXX > 65)) || ((eventSlave.attrXX <= 35) && (eventSlave.attrXY > 65))) { - V.RESSevent.push("dickgirl PC"); - } - } - } - } - } - } - if (eventSlave.trust <= 20) { if (eventSlave.trust >= -75) { if (eventSlave.devotion <= 30) { @@ -516,22 +479,6 @@ if(eventSlave.drugs === "breast injections") { } } - if (eventSlave.devotion <= 20) { - if (eventSlave.devotion >= -50) { - V.RESSevent.push("resistant shower"); - } - } - - if (eventSlave.rules.release.masturbation === 0 && !App.Utils.hasNonassignmentSex(eventSlave)) { - if (eventSlave.need) { - if (eventSlave.devotion >= -20) { - if (eventSlave.trust >= -50) { - V.RESSevent.push("desperately horny"); - } - } - } - } - if (eventSlave.assignment !== Job.QUARTER) { if (eventSlave.skill.entertainment >= 100) { if (eventSlave.trust > 50) { @@ -542,22 +489,6 @@ if(eventSlave.drugs === "breast injections") { } } - if (eventSlave.dick > 0) { - if (eventSlave.balls === 0) { - if (eventSlave.genes === "XY") { - if (eventSlave.devotion <= 50) { - if (eventSlave.trust < -50) { - if (eventSlave.anus > 0) { - if (canDoAnal(eventSlave)) { - V.RESSevent.push("resistant gelding"); - } - } - } - } - } - } - } - if ([Job.PUBLIC, Job.WHORE].includes(eventSlave.assignment)) { if (eventSlave.vagina !== 0) { if (eventSlave.anus !== 0) { @@ -638,12 +569,6 @@ if(eventSlave.drugs === "breast injections") { } } - if (eventSlave.minorInjury === "sore ass") { - if (eventSlave.devotion <= 50) { - V.RESSevent.push("sore ass"); - } - } - if (eventSlave.sexualFlaw === "hates oral") { if (V.PC.dick !== 0) { if (eventSlave.devotion <= 50) { @@ -704,22 +629,6 @@ if(eventSlave.drugs === "breast injections") { } } - if (eventSlave.rules.release.masturbation === 1) { - if (eventSlave.belly < 300000) { - if (eventSlave.anus > 2) { - if (eventSlave.fetish === "buttslut" || eventSlave.energy > 95) { - if (eventSlave.fetish !== "none") { - if (canHold(eventSlave)) { - if (canDoAnal(eventSlave)) { - V.RESSevent.push("loose buttslut"); - } - } - } - } - } - } - } - if (eventSlave.boobs > 1200) { if (eventSlave.areolaeShape !== "circle") { if (eventSlave.devotion > 50) { @@ -728,38 +637,12 @@ if(eventSlave.drugs === "breast injections") { } } - if (eventSlave.assignment !== Job.QUARTER) { - if (eventSlave.behavioralFlaw === "arrogant") { - if (eventSlave.devotion < -50) { - if (eventSlave.trust >= -50) { - V.RESSevent.push("rebellious arrogant"); - } - } - } - } - if (V.seePreg !== 0) { if (eventSlave.bellyPreg >= 10000) { V.RESSevent.push("hugely pregnant"); } } - if (eventSlave.hormoneBalance >= 50) { - if (eventSlave.vagina === -1) { - if (eventSlave.balls >= 0) { - if (eventSlave.devotion > 20 || eventSlave.trust < -20) { - if (eventSlave.devotion <= 50) { - if (eventSlave.fetish !== "buttslut") { - if (eventSlave.rules.speech === "permissive") { - V.RESSevent.push("hormone dysfunction"); - } - } - } - } - } - } - } - if (eventSlave.vaginaPiercing > 1) { if (eventSlave.nipplesPiercing > 1) { if (eventSlave.clitPiercing > 1) { @@ -774,18 +657,6 @@ if(eventSlave.drugs === "breast injections") { } } - if (eventSlave.fetishKnown === 1) { - if (eventSlave.fetish === "cumslut" || eventSlave.energy > 95) { - if ([Job.PUBLIC, Job.WHORE, Job.GLORYHOLE].includes(eventSlave.assignment)) { - if (eventSlave.devotion > 20) { - if (V.PC.dick !== 0) { - V.RESSevent.push("cumslut whore"); - } - } - } - } - } - if (eventSlave.anus === 0) { if (eventSlave.devotion < -20) { if (eventSlave.trust >= -20) { diff --git a/src/js/upgrade.js b/src/js/upgrade.js new file mode 100644 index 0000000000000000000000000000000000000000..599f0f99d2f7e0e39cd2d8b890ba6b7875041fac --- /dev/null +++ b/src/js/upgrade.js @@ -0,0 +1,129 @@ +/** @implements {FC.IUpgrade} */ +App.Upgrade = class Upgrade { + /** + * @param {string} property The variable name of the property. + * @param {FC.IUpgradeTier[]} tiers A list of tiers available for the upgrade. + * @param {Object} [object] Any object to attach the upgrade to, if not the default `V`. + */ + constructor(property, tiers, object = V) { + /** @private */ + this._property = property; + + /** @private */ + this._div = document.createElement("div"); + /** @private @type {Object} */ + this._object = object; + /** @private @type {FC.IUpgradeTier[]} */ + this._tiers = tiers; + } + + /** + * Puts the different sections together into one passage. + * + * @private + * @returns {DocumentFragment} + */ + _assemble() { + const frag = new DocumentFragment(); + + this.tiers.forEach(tier => { + const { + value, link, base, upgraded, handler, note, prereqs, nodes, + } = tier; + + let cost = Math.trunc(tier.cost) || 0; + + if (!prereqs || prereqs.every(prereq => prereq())) { + if (upgraded + && (_.isEqual(V[this.property], value) + || _.isEqual(this._object[this.property], value))) { + App.UI.DOM.appendNewElement("div", frag, upgraded); + } else { + App.UI.DOM.appendNewElement("div", frag, base); + App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.link(link, () => { + cashX(forceNeg(cost), "capEx"); + + if (this._object) { + this._object[this.property] = value; + } else { + V[this.property] = value; + } + + if (handler) { + handler(); + } + + this.refresh(); + }, [], '', + `${cost > 0 ? `Costs ${cashFormat(cost)}` : `Free`}${note ? `${note}` : ``}.`), + ['indent']); + + if (nodes) { + App.Events.addNode(frag, nodes); + } + } + } + }); + + return frag; + } + + /** + * Renders the facility onscreen. + * + * @returns {HTMLDivElement} + */ + render() { + this._div.append(this._assemble()); + + return this._div; + } + + /** + * Refreshes the facility onscreen. + * + * @returns {void} + */ + refresh() { + App.UI.DOM.replace(this._div, this._assemble()); + } + + /** + * Adds new tiers to the upgrade. + * + * @param {FC.IUpgradeTier[]} tiers + * @returns {this} + */ + addTiers(...tiers) { + this._tiers.push(...tiers); + + return this; + } + + /** + * The variable name of the property. + * + * @returns {string} + */ + get property() { + return this._property; + } + + /** + * All tiers that are available. + * + * @returns {FC.IUpgradeTier[]} + */ + get tiers() { + return this._tiers; + } + + /** + * The object the upgrade is attached to. + * + * @returns {Object} + */ + get object() { + return this._object; + } +}; diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js index c75292dc954224af2ebcff6b4dc61ee4433aad4e..5d0bf4323822e5c6a8f7b3a44b410574e67e2dd7 100644 --- a/src/js/utilsDOM.js +++ b/src/js/utilsDOM.js @@ -544,3 +544,19 @@ App.UI.DOM.makeCheckbox = function(arg) { }; return checkbox; }; + +/** + * Draw a single medium-sized slave image, floating to the right of a block of text. + * If you're rendering simple scene-wide art where the relationship between text and image location isn't important, @see App.Events.drawEventArt instead. + * @param {ParentNode} node + * @param {App.Entity.SlaveState} slave + * @param {App.Art.SlaveArtBatch} [batchRenderer] an initialized batch renderer with the preamble already output; if omitted, the entire art block will be output inline + * @returns {HTMLDivElement|DocumentFragment} + */ +App.UI.DOM.drawOneSlaveRight = function(node, slave, batchRenderer) { + if (!V.seeImages || !slave) { + return new DocumentFragment(); + } + const artElement = batchRenderer ? batchRenderer.render(slave) : App.Art.SlaveArtElement(slave, 2, 0); + return App.UI.DOM.appendNewElement("div", node, artElement, ["imageRef", "medImg"]); +}; diff --git a/src/js/utilsSC.js b/src/js/utilsSC.js index 260b3d96a22f1e56f3e5daa55a543535c1d6dba4..a2de774ae8c71356dedf8795e57079e29807ccd1 100644 --- a/src/js/utilsSC.js +++ b/src/js/utilsSC.js @@ -227,8 +227,8 @@ App.UI.tabBar = function() { /** handler function for slaveDescriptionDialog. do not call directly. */ App.UI._showDescriptionDialog = function(slave, options) { Dialog.setup(SlaveFullName(slave)); - const image = V.seeImages ? App.UI.DOM.makeElement("div", App.Art.SlaveArtElement(slave, 2, 0), ["imageRef", "medImg"]) : ''; - Dialog.append(image).append(App.Desc.longSlave(slave, options)); + App.UI.DOM.drawOneSlaveRight(Dialog.body(), slave); + Dialog.append(App.Desc.longSlave(slave, options)); Dialog.open(); }; diff --git a/src/npc/interaction/passage/matchmaking.js b/src/npc/interaction/passage/matchmaking.js index c5987fe23718399781cbf7f46da678c8c497035b..d06ae2cd4c3a8f86603449da2ec69846b3db17a4 100644 --- a/src/npc/interaction/passage/matchmaking.js +++ b/src/npc/interaction/passage/matchmaking.js @@ -14,13 +14,9 @@ App.Interact.matchmaking = function(slave) { const desc = SlaveTitle(slave); - if (V.seeImages) { - node.append( - App.UI.DOM.makeElement("div", App.Art.SlaveArtElement(slave, 2, 0), ["imageRef", "medImg"]) - ); - } + App.UI.DOM.drawOneSlaveRight(node, slave); - r.push(`You order ${slave.slaveName} to come to your office. The`); + r.push(`You order`, App.UI.DOM.slaveDescriptionDialog(slave, slave.slaveName, {noArt: true}), `to come to your office. The`); if (slave.relationship === -2) { r.push(`worshipful`); } else { @@ -222,6 +218,7 @@ App.Interact.matchmaking = function(slave) { slave.trust -= 10; subSlave.trust -= 10; } + App.Events.addParagraph(frag, r); return frag; } diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index 77f00e57e2afc3a30bec005aa7f3207f8578c641..ade5731cee2a9c3c171a9cf8e12eb5afb29d0144 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -45,7 +45,6 @@ <<if ["age implant", "ara ara", "back stretch", -"bad dream", "bonded love", "breast expansion blues", "confident tanning", @@ -65,9 +64,6 @@ "implant inspection", "mods please", "orchiectomy please", -"rebellious arrogant", -"resistant gelding", -"resistant shower", "restricted profession", "sexy succubus", "shaped areolae", @@ -75,7 +71,6 @@ "shift sleep", "shower slip", "slave dick huge", -"sleeping ambivalent", "sore shoulders", "spa boobs", "subjugation blues", @@ -389,39 +384,6 @@ in the middle of the room with the machines all around $him. $He has <<if canDoV <br><br> The source of the many-voiced personal assistant becomes clear: probably on the incorrigible $activeSlave.slaveName's request, your sultry personal assistant is voicing each and every one of the machines. When the nymphomaniac masturbator tries to smile <<if hasAnyArms($activeSlave)>> and wave<</if>>, there's an absolute chorus of "Back to work, slut", "Smile less, suck more", "Take it, bitch", et cetera. Yet another instance of $assistant.name chuckles in your ear. "Care to join in, <<= properTitle()>>? I'm sure we can find room somewhere." -<<case "sore ass">> - -One night, you see <<= App.UI.slaveDescriptionDialog($activeSlave)>> -<<if (!hasAnyLegs($activeSlave))>> - scooting $himself from side to side uncomfortably, -<<elseif ($activeSlave.heels == 1 && shoeHeelCategory($activeSlave) == 0)>> - crawling gingerly, -<<elseif (shoeHeelCategory($activeSlave) > 1)>> - tottering along painfully, -<<else>> - walking a little funny, -<</if>> -as though $he has a sore butt. You call $him over to inspect $his backdoor to see if $he needs care, <<if (!hasAnyLegs($activeSlave))>>and set $his helpless body down, spreading $his buttocks to examine $his anus.<<else>>and order $him to spread $his buttocks for you so you can examine $his anus.<</if>> $His asshole is fine, just a little sore from hard buttfucks. $He complies with you, but as you probe $him gently with a finger, -<<if !canTalk($activeSlave) && (!hasAnyArms($activeSlave))>> - $he wriggles desperately and turns to mouth "it hurts <<Master>> please don't assrape me" at you. -<<elseif !canTalk($activeSlave)>> - $he gestures desperately, telling you $his butt hurts and asking you not to assfuck $him. -<<else>> - $he bursts out, "<<Master>>, my butt i<<s>> <<s>>o <<s>>ore! Plea<<s>>e don't u<<s>>e my a<<ss>>, <<Master>>. Plea<<s>>e." -<</if>> - -<<case "resistant shower">> - -Though $assistant.name constantly monitors all your slaves, you keep an eye on the video feeds yourself. There's nothing like the personal, human touch. You notice one night that <<= App.UI.slaveDescriptionDialog($activeSlave)>> is crouched in the bottom of the shower. Sensing something amiss, you discreetly investigate, and find that $he's crying quietly under the warm water. - -<<case "resistant gelding">> - -<<= App.UI.slaveDescriptionDialog($activeSlave)>> is standing in the bathroom in front of the sink, with one leg up on the counter so $he can inspect $his genitalia. <<if canSee($activeSlave)>>From the feeds, it's obvious $he's grieved by what $he sees. As you watch, $he sobs quietly, reaching towards where $his scrotum used to be with a trembling hand. Apparently, $he's having trouble accepting $his status as a gelded slut<<else>>From the feeds, it's obvious $he's grieved by what $he feels. As you watch, $he sobs quietly, reaching towards where $his scrotum used to be with a trembling hand. Apparently, $he's having trouble accepting $his status as a gelded slut<</if>>. - -<<case "rebellious arrogant">> - -You have a lot of work to do with <<= App.UI.slaveDescriptionDialog($activeSlave)>>. $He compounds the usual rebellious anger at being a slave with an apparently unshakeable conviction that $he is better than you. Oddly, $he seems to maintain the idea that enslaving other people is somehow inappropriate, and that having done so has lowered you morally. This morning, $he did not appear to start $his morning chores as previously ordered. $He sleeps on a bedroll: a brief investigation discloses that $he is still in it, and has pulled the blanket up over $his head. $He refuses to acknowledge your peremptory command to get up. - <<case "vocal disobedience">> One morning, despite the fact that $he is not allowed to speak without being spoken to, <<= App.UI.slaveDescriptionDialog($activeSlave)>> <<if canSee($activeSlave)>>looks you directly in the eye<<else>>faces you<</if>> and asks @@ -449,68 +411,6 @@ One morning, despite the fact that $he is not allowed to speak without being spo <br><br> As you watch $him, it occurs to you that since $activeSlave.slaveName isn't fully devoted to you yet, there's all manner of inventive ways you could have a little fun and increase $his submission to you at the same time. -<<case "cumslut whore">> - -Late at night, <<= App.UI.slaveDescriptionDialog($activeSlave)>> returns to the living area of the penthouse. It's the end of $his day as a working girl, and despite being obviously tired, $he's smiling with obvious sexual satiation. Every so often, $he'll get a dreamy expression and lick $his lips. $He fetishizes cum to the extent that getting to eat a <<if $showInches == 2>>mile<<else>>kilometer<</if>> of dick really satisfies $him. - -<<case "loose buttslut">> - -<<= App.UI.slaveDescriptionDialog($activeSlave)>> has a little free time this evening, so $he finds a quiet corner and engages in $his anal proclivities. Since $his asshole is so stretched out, $he sticks the base of a huge dildo to the ground and -<<if $activeSlave.belly >= 100000>> - struggles to lower $his heavy, very gravid body down onto it, -<<elseif $activeSlave.belly >= 10000>> - cautiously lowers $his <<if $activeSlave.bellyFluid >= 10000>><<print $activeSlave.inflationType>>-stuffed<<else>>very gravid<</if>> body on it, -<<elseif $activeSlave.belly >= 5000>> - delicately lowers $his <<if $activeSlave.bellyFluid >= 5000>>bloated<<else>>gravid<</if>> body on it, -<<else>> - squats on it, -<</if>> -moaning happily as the massive thing inches into $him. $He starts to slide up and down it <<if hasBothArms($activeSlave)>>hands-free<<else>>automatically<</if>>, so $he -<<if canAchieveErection($activeSlave)>> - <<if $activeSlave.dick > 5>> - jacks off $his huge cock with <<if hasBothArms($activeSlave)>>both hands<<else>>$his hand<</if>>. - <<elseif $activeSlave.dick > 2>> - jacks off with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand and <<if $activeSlave.nipples != "fuckable">>pinches<<else>>fingers<</if>> a nipple with the other<</if>>. - <<elseif $activeSlave.dick > 0>> - rubs $his little penis with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand and <<if $activeSlave.nipples != "fuckable">>pinches<<else>>fingers<</if>> a nipple with the other<</if>>. - <</if>> -<<elseif $activeSlave.dick > 5>> - massages $his huge, limp cock with <<if hasBothArms($activeSlave)>>both hands<<else>>$his hand<</if>>. -<<elseif $activeSlave.dick > 2>> - attempts to jack off $his limp dick with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand while <<if $activeSlave.nipples != "fuckable">>pinching<<else>>fingering<</if>> a nipple with the other<</if>>. -<<elseif $activeSlave.dick > 0>> - rubs $his little penis with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand and <<if $activeSlave.nipples != "fuckable">>pinches<<else>>fingers<</if>> a nipple with the other<</if>>. -<<elseif $activeSlave.vagina == -1>> - rubs the sensitive area around $his asspussy with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand and <<if $activeSlave.nipples != "fuckable">>pinches<<else>>fingers<</if>> a nipple with the other<</if>>. -<<else>> - rubs $his clit with <<if !hasBothArms($activeSlave)>>$his hand<<else>>one hand and <<if $activeSlave.nipples != "fuckable">>pinches<<else>>fingers<</if>> a nipple with the other<</if>>. -<</if>> -As $he enjoys $himself, $his loose sphincter relaxes still further until it's barely gripping the dildo. - -<<case "hormone dysfunction">> - -<<= App.UI.slaveDescriptionDialog($activeSlave)>> comes to see you. You're busy with other things, so $he waits patiently even though $he's clearly very unhappy. Told to explain $himself, $he gestures at $his totally flaccid -<<if !canTalk($activeSlave)>> - penis. -<<else>> - <<if ($activeSlave.lips > 70)>> - penis and <<say>>s through $his huge lips, - <<elseif ($activeSlave.lipsPiercing + $activeSlave.tonguePiercing > 2)>> - penis and <<say>>s through $his piercings, - <<else>> - penis and <<say>>s, - <</if>> - "<<Master>>, I can't get it up." -<</if>> -Ever since the rules have permitted it, $activeSlave.slaveName has been a constant masturbator. If $he can help it, $he never sucks or gives up $his ass without a hand between $his legs, pumping away. -<br><br> -<<if !canTalk($activeSlave)>> - $He mimics masturbation and then traces a finger down $his cheek, as though it were a tear. -<<else>> - "I can't come like thi<<s>>, <<Master>>." -<</if>> -It makes sense; $he's probably never masturbated without a hard dick. $He's clearly in desperate need of release, and more than a little sad the hormones $he's taking have given $him erectile dysfunction. - <<case "age implant">> In the morning the penthouse is a busy bustle of female energy. Slaves get up promptly, eat, shower, dress themselves, and head out to work. They chatter if able and allowed, and draw a good deal of strength from each other. As you pass by the kitchen, you are narrowly avoided by a rush of slaves heading to the showers. They're almost bouncing, feeding off each others' youthful energy. At the back of the pack is <<= App.UI.slaveDescriptionDialog($activeSlave)>>. $He looks as young as any of them, but after they're out, $he leans against the door frame for a moment and exhales slowly. @@ -629,20 +529,6 @@ The showers your slaves use are well vented and transparent walled so that you c <</if>> <</if>> -<<case "devoted old">> - -At the end of a long week, <<= App.UI.slaveDescriptionDialog($activeSlave)>> moves past your office toward bed. This is completely normal part of the arcology routine, but you notice as $he passes that $he's wearing a preoccupied, almost sad expression. You call $him over, and $he makes a visible effort to brighten up as $he comes before you and asks your pleasure. You ask $him what's the matter, and $his face falls. -<br><br> -"<<Master>>, I'm <<s>>o <<s>>orry you noti<<c>>ed," -<<if ($activeSlave.lips > 70)>> - $he lisps through $his dick-sucking lips. -<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>> - $he lisps through $his ridiculous piercings. -<<else>> - $he <<say>>s penitently. -<</if>> -"I'm feeling a little <<s>>tiff and tired, <<Master>>. I wi<<sh>> I wa<<s>> a little younger <<s>>o I could <<s>>erve you better, that'<<s>> all." - <<case "tendon fall">> There is a horrible crash from the bathroom. You rush in to see <<= App.UI.slaveDescriptionDialog($activeSlave)>> curled up helplessly in the bottom of the shower with the water playing over $his <<if $activeSlave.belly >= 5000>><<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>rounded<</if>><<else>>altered<</if>> body. $He takes off $his heels to shower, making $him unable to stand independently. Apparently, $he lost $his grip on the handrail while trying to soap $himself, and having fallen, can't seem to reach the rail to haul $himself up again. $He pleads<<if ($activeSlave.lips > 70)>> through $his huge lips<<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>> through $his piercings<</if>>, "Help me, <<Master>>!" @@ -875,51 +761,6 @@ $He stops and <<if canSee($activeSlave)>>stares<<else>>faces you<</if>>, struggl Even $his nipples show signs of wear, having prolapsed slightly from heavy use. <</if>> -<<case "desperately horny">> - -<<= App.UI.slaveDescriptionDialog($activeSlave)>> comes to see you, looking deeply unhappy and shivering occasionally. -<<if ($activeSlave.rules.speech == "restrictive")>> - Since $he is not allowed to speak, $he just enters your office and stands there, unsure what to do. -<<else>> - <<if !canTalk($activeSlave)>> - $He tries to communicate something with $his hand<<if hasBothArms($activeSlave)>>s<</if>>, but $he's so distracted $he can't manage it. $He starts to shake a little and gives up. - <<else>> - "<<Master>>, plea<<s>>e! Plea<<s>>e — I — plea<<s>>e, I need to — oh, <<Master>> —" $he <<if SlaveStatsChecker.checkForLisp($activeSlave)>>lisps frantically<<else>>babbles<</if>>. $He starts to shake a little and lapses into silence. - <</if>> -<</if>> -The reason for $his distress is obvious: -<<if ($activeSlave.chastityPenis == 1)>> - $his chastity cage is mostly solid, but it has a small hole below where the tip of $his dick is held, and this is dripping precum. $He's sexually helpless, and sexually overcharged to the point where $he's dripping more precum than a usual dickgirl might ejaculate normally. -<<elseif ($activeSlave.dick > 0) && ($activeSlave.hormoneBalance >= 100) && !canAchieveErection($activeSlave)>> - though the hormones are keeping it soft, $his member is dripping a stream of precum; droplets of the stuff spatter $his legs. One of $his spasms brings $his dickhead brushing against $his thigh, and the stimulation almost brings $him to orgasm. -<<elseif ($activeSlave.dick > 0) && $activeSlave.balls > 0 && $activeSlave.ballType == "sterile" && !canAchieveErection($activeSlave)>> - though $he's chemically castrated, $his soft member is dripping a stream of watery precum; droplets of the stuff spatter $his legs. One of $his spasms brings $his dickhead brushing against $his thigh, and the stimulation almost brings $him to orgasm. -<<elseif ($activeSlave.dick > 0) && ($activeSlave.balls == 0) && !canAchieveErection($activeSlave)>> - though $he's gelded, $his soft member is dripping a stream of watery precum; droplets of the stuff spatter $his legs. One of $his spasms brings $his dickhead brushing against $his thigh, and the stimulation almost brings $him to orgasm. -<<elseif ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>> - though $he's far too large to get hard, $his engorged member is dripping a stream of watery precum; droplets of the stuff spatter the floor. One of $his spasms brushes the length of $his cock against $his thigh, and the stimulation almost brings $him to orgasm. -<<elseif $activeSlave.dick > 4>> - $his gigantic member juts out painfully, scattering droplets of precum whenever $he moves. One of $his spasms brings $his dickhead brushing up against $his <<if $activeSlave.belly >= 10000 || $activeSlave.weight > 95>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>><<else>>abdomen<</if>>, and the stimulation almost brings $him to orgasm. -<<elseif $activeSlave.dick > 2>> - $his impressive member juts out painfully, scattering droplets of precum whenever $he moves. One of $his spasms brings $his dickhead brushing up against $his <<if $activeSlave.belly >= 10000 || $activeSlave.weight > 95>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>><<else>>abdomen<</if>>, and the stimulation almost brings $him to orgasm. -<<elseif $activeSlave.dick > 0>> - $his little member juts out painfully, scattering droplets of precum whenever $he moves. One of $his spasms brings $his dickhead brushing up against $his <<if $activeSlave.belly >= 10000 || $activeSlave.weight > 95>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>><<else>>abdomen<</if>>, and the stimulation almost brings $him to orgasm. -<<elseif ($activeSlave.chastityVagina)>> - female juices are leaking out from behind $his chastity belt. $His cunt desperately wants to be fucked, and is dripping natural lubricant to ease penetration by cocks that cannot reach it through its protective shield. -<<elseif $activeSlave.clit > 3>> - $his dick-like clit is painfully engorged and juts out massively. The stimulation of the air on $his clit keeps $him on the brink of orgasm. -<<elseif $activeSlave.clit > 0>> - $his lovely clit is painfully engorged, and $his pussy is so wet there are little rivulets of moisture running down $his inner thighs. One of $his spasms brings $his clit brushing accidentally against $his hand, and the stimulation almost brings $him to orgasm. -<<elseif $activeSlave.labia > 0>> - $his lovely pussylips are painfully engorged, and $his pussy is so wet there are little rivulets of moisture running down $his inner thighs. One of $his spasms brings $his generous labia brushing against $his thighs, and the stimulation almost brings $him to orgasm. -<<elseif $activeSlave.vagina == -1>> - though $he has no external genitalia to display it, $he's flushed and uncomfortable, and is unconsciously presenting $his ass, since that's $his only real avenue to climax. -<<else>> - $his pussy is so wet there are little rivulets of moisture running down $his inner thighs. One of $his spasms brings $him enough stimulation that it almost brings $him to orgasm. -<</if>> -<br><br> -This is the result of not getting off for several days while on the slave diet provided by the nutritional systems. The mild aphrodisiacs included in $his food increase $his sex drive, and the increased libido can become cumulative if it's not regularly addressed. It looks like $he hasn't really gotten $hers in a couple of days, and the poor $girl can likely think of nothing but that. $He's so horny $he'll do anything for release. However, $he did come to you with $his trouble rather than masturbating illicitly. - <<case "restricted profession">> <<set _shoutitoutloud = $enunciate.title.toUpperCase()>> @@ -992,65 +833,6 @@ At your <<if canSee($activeSlave)>>nod<<else>>acknowledgment<</if>>, $he $He blushes prettily and <<if canSee($activeSlave)>>looks<<else>>gazes<</if>> at you hopefully. <</if>> -<<case "dickgirl PC">> - -Having just enjoyed one of your slaves, you take a quick post-coital rinse in one of the showers scattered around the arcology for the purpose. Thus refreshed, you step out and come face to face with <<= App.UI.slaveDescriptionDialog($activeSlave)>>, who is going about $his assigned business. $His <<= App.Desc.eyesColor($activeSlave)>> lock with yours for a surprised moment, and then flick down submissively. -<br><br> -As $his gaze travels down your body towards the floor, -<<if $activeSlave.attrXY <= 35>> - it lingers for a moment on your - <<if $PC.boobs >= 1400>> - enormous <<if $PC.boobsImplant > 0>>chest balloons<<else>>cow tits<</if>> - <<elseif $PC.boobs >= 1200>> - huge<<if $PC.boobsImplant > 0>>, clearly fake<<else>>, heavy<</if>> breasts - <<elseif $PC.boobs >= 1000>> - big<<if $PC.boobsImplant > 0>>, perky<</if>> breasts - <<elseif $PC.boobs >= 800>> - generous breasts - <<elseif $PC.boobs >= 650>> - handfilling breasts - <<elseif $PC.boobs >= 500>> - average breasts - <<elseif $PC.boobs >= 300>> - small breasts - <</if>> - before continuing to track downward. When it reaches your cock, still half-hard from the sex and the warm shower, $he stiffens with discomfort. -<<else>> - $he averts $his eyes from your - <<if $PC.boobs >= 1400>> - enormous, bare <<if $PC.boobsImplant > 0>>chest balloons<<else>>cow tits<</if>> - <<elseif $PC.boobs >= 1200>> - huge, bare<<if $PC.boobsImplant > 0>>, clearly fake<<else>>, heavy<</if>> breasts - <<elseif $PC.boobs >= 1000>> - big, bare<<if $PC.boobsImplant > 0>>, perky<</if>> breasts - <<elseif $PC.boobs >= 800>> - generous, bare breasts - <<elseif $PC.boobs >= 650>> - handfilling, bare breasts - <<elseif $PC.boobs >= 500>> - average, bare breasts - <<elseif $PC.boobs >= 300>> - small, bare breasts - <</if>> - as best $he can, quickly looking farther down. $His gaze lingers for a moment on your cock, still half-hard from the sex and the warm shower, but $he's stiff with discomfort. -<</if>> -$He swallows uncomfortably, frozen in place and staring at the floor. $His eyes flick up again, stealing a glance at -<<if $activeSlave.attrXY <= 35>> - your boobs and studiously avoiding your dick. -<<else>> - your dick<<if $PC.balls >= 8>> and enormous testicles, while<<else>> and<</if>> studiously avoiding your boobs. -<</if>> -<<if !canTalk($activeSlave)>> - $He gestures a proper greeting, hands shaking with nervousness. -<<else>> - "Um, hi, <<Master>>," $he <<say>>s nervously. -<</if>> -<<if $activeSlave.attrKnown != 1>> - <br><br> - Just like that, the existing mystery about $his feelings about girls and guys is @@.lightcoral;cleared up.@@ - <<set $activeSlave.attrKnown = 1>> -<</if>> - <<case "resistant anal virgin">> <<= App.UI.slaveDescriptionDialog($activeSlave)>> has never had anything significant up $his ass. Living in $arcologies[0].name, $he can't have missed that anal sex is a part of most slaves' lives. $He <<if canSee($activeSlave)>>witnesses<<elseif canHear($activeSlave)>>hears<<else>>thinks about<</if>> sodomy several times a day, at least. @@ -1183,14 +965,6 @@ To go by $his behavior, the likelihood that $he's actually eager to <<if $PC.dic It's Friday evening, the most socially important part of the week in $arcologies[0].name. <<= App.UI.slaveDescriptionDialog($activeSlave)>> happens to be free this evening, and your schedule is open, too. Lately, $he's been putting on a tour de force of seduction, erotic dance, and lewd entertainment whenever $he gets the chance to catch someone's eye<<if $activeSlave.belly >= 5000>>, even with $his <<if $activeSlave.bellyPreg >= 3000>>advanced pregnancy<<elseif $activeSlave.bellyImplant >= 3000>>_belly rounded belly<<else>>sloshing <<print $activeSlave.inflationType>>-filled stomach<</if>><</if>>. There are a number of events tonight you could attend with $him on your arm. -<<case "sleeping ambivalent">> - -Passing through the slave dormitory at night, you run your eyes down the row of sleeping chattel. The light here is low, but it's not dark. Slaves need to be able to find the bathroom, slaves on late assignments need to find their beds, and those permitted to do so need to be able to select slaves for sex. <<= App.UI.slaveDescriptionDialog($activeSlave)>> catches your eye. The dormitory is kept at a pleasant temperature so that the slaves, who of course sleep nude, are comfortable on their bedrolls covered by a single sheet, or nothing at all. $He probably went to sleep with $his sheet pulled up to $his chin, which is normal behavior for slaves who aren't yet accepting of their status as compulsory sex objects, but $he's shrugged it down. Half $his torso is bare. -<br><br> -The dim blue light plays across $his $activeSlave.skin skin. <<if $activeSlave.boobs > 2000>>$His massive boob on that side is slightly shifted by each breath<<elseif $activeSlave.boobs > 800>>$His breast on that side rises and falls with each breath<<else>>That side of $his chest rises and falls with each breath<</if>>. -<<if $activeSlave.belly >= 5000>> $His _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly is only partially covered by the sheet, leaving most of it visible.<</if>> -$He's sleeping soundly, $his breaths coming deep and slow. Most slaves where $he is mentally are troubled by bad dreams, but the poor $girl is evidently too tired for that. - <<case "sexy succubus">> You cross paths with <<= App.UI.slaveDescriptionDialog($activeSlave)>> as $he moves from the living area to $activeSlave.assignment, just starting $his day. $He's full of energy, and $his succubus outfit is delightful. $He <<if canSee($activeSlave)>>sees your glance<<else>>recognizes your whistle<</if>> and greets you with a <<if canSee($activeSlave)>>wicked glint in $his eye<<else>>wicked smirk on $his face<</if>>, bowing a bit to show off $his <<if $activeSlave.boobs > 6000>>bare, inhumanly large breasts<<elseif $activeSlave.lactation > 0>>bare udders, heavy with milk<<elseif $activeSlave.boobsImplant > 0>>naked fake tits<<elseif $activeSlave.boobs > 800>>heavy, naked breasts<<elseif $activeSlave.boobs > 300>>naked little tits<<else>>pretty chest<</if>> and then continuing towards you with a pirouette. $His tail bounces flirtily, holding the back of $his skirt up to show off <<if $activeSlave.butt > 8>>$his absurdly wide bottom<<elseif $activeSlave.analArea > 3>>the broad area of puckered skin around $his slutty asspussy<<elseif $activeSlave.buttImplant > 0>>$his butt implants<<elseif $activeSlave.butt > 5>>$his big butt<<elseif $activeSlave.anus > 1>>a hint of $his asshole, which $his cute buttocks don't quite conceal<<else>>$his cute bottom<</if>>. @@ -1356,29 +1130,6 @@ Coming to a stop, $he <<if $activeSlave.height > 190>>bends the long, long way d "I love you, <<Master>>," $he whispers. <</if>> -<<case "bad dream">> - -Passing near the slave dormitory late at night, you hear a quiet cry within. This is strange; most slaves housed there are not inclined or not allowed to have sex in the middle of the night, and in any case, the noise wasn't one of pleasure. Looking in, you see a jerky movement near the door. It's <<= App.UI.slaveDescriptionDialog($activeSlave)>>, and $he's obviously having a bad dream. $He raises <<if hasBothArms($activeSlave)>>an<<else>>$his<</if>> arm to fend off some imagined danger, and in doing so, pushes the sheet down around $his waist. $He sleeps naked, like all your slaves, and the movement bares $his <<if $activeSlave.boobs > 2000>>udders<<elseif $activeSlave.boobs > 1000>>heavy breasts<<elseif $activeSlave.boobs > 400>>boobs<<else>>little tits<</if>><<if $activeSlave.belly >= 5000>> and _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<</if>> to the cool night air. The low blue light outlines $his nipples as they <<if $activeSlave.nipples != "fuckable">>stiffen<<else>>swell<</if>> at the sudden change of temperature, -<<switch $activeSlave.nipples>> -<<case "tiny">> - pricking up into little buds. -<<case "flat">> - becoming visible against $his areolae. -<<case "puffy">> - the puffy promontories jutting even farther out. -<<case "partially inverted">> - just starting to poke past their inversion. -<<case "inverted">> - the twin domes formed by their inverted shapes becoming more prominent. -<<case "huge">> - becoming so large they cast long shadows across $his bed. -<<case "fuckable">> - the fuckable holes steadily closing and starting to poke outwards. -<<default>> - becoming attractively erect. -<</switch>> -Still dreaming, $he clasps $his arm<<if hasBothArms($activeSlave)>>s<</if>> protectively over $his <<if $activeSlave.pregKnown == 1>>unborn child<<if $activeSlave.pregType > 1>>ren<</if>><<else>>vulnerable chest<</if>>, and rolls to one side. Halfway into a fetal position, $he turns $his head against $his pillow, murmuring "N-no — plea<<s>>e no — I'll d-do anyth-thing — no..." - <<case "shower slip">> <<= App.UI.slaveDescriptionDialog($activeSlave)>> finishes $his morning shower and sleepily turns to dry off. $He slips a little on the moist bathroom floor, trips over $his own feet, and starts to stumble. $His fall is immediately arrested as $he's caught by a pair of strong<<if $PC.title == 0>> yet feminine<</if>> arms. Coming to rest against @@ -3073,288 +2824,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>> <</if>> -<<case "sore ass">> - -<<link "Punish $his ass for insolence">> - <<replace "#result">> - You inform $him sternly that you will ensure that $he is not permanently damaged, and that otherwise, $he is to take anal pain like a good buttslave. $He starts to beg and whine as you lean back in your chair and <<if $PC.dick == 0>>hold $him upside down on your chest so $he can lick your pussy while you use a dildo on $his ass.<<else>>set $him on your chest before reaching around to line your cock up with $his sore hole. $He shudders and writhes when you start pushing yourself inside.<</if>> You use hard pinches to $his nipples to punish $his whining, forcing $him to take a long, painful buttfuck in silence. @@.gold;$He has become more afraid of you.@@ - <<if ($activeSlave.anus < 3)>>$His week of tough anal experience has @@.lime;permanently loosened $his anus.@@<<set $activeSlave.anus += 1>><</if>> - <<set $activeSlave.trust -= 5>> - <<= VCheck.Anal($activeSlave, 1)>> - <</replace>> -<</link>> -<br><<link "Give $him some care">> - <<replace "#result">> - $He's filled with anxiety as you - <<if $activeSlave.belly < 1500>> - lay $him face-down on your desk, - <<else>> - direct $him to lay on $his side on your desk<<if $activeSlave.belly >= 300000>> with $his _belly belly hanging over the edge<</if>>, - <</if>> - but is surprised and reassured when $he's penetrated not by a <<if $PC.dick == 0>>strap-on<<else>>turgid<<if $PC.vagina != -1>> futa<</if>> cock<</if>> but by a single gentle finger coated with something healing and cool. The mixed analgesic and anti-inflammatory takes the sharpness off the sore feeling, and will help get $his butt back into fucking shape. @@.mediumaquamarine;$He has become more accepting of anal slavery,@@ and @@.health.inc;$his asshole feels better.@@ - <<if ($activeSlave.anus > 2)>>Your expert care has @@.orange;allowed $his loose asspussy to recover a little of its natural shape and size.@@<<set $activeSlave.anus -= 1>><</if>> - <<set $activeSlave.trust += 4, $activeSlave.minorInjury = 0>> - <</replace>> -<</link>> - -<<case "resistant shower">> - -<<link "Enter the shower and quietly comfort $him">> - <<replace "#result">> - $He starts with surprise <<if canSee($activeSlave)>>as you enter the shower<<elseif canHear($activeSlave)>>as $he hears you enter the shower<<else>>as $he feels the water being disturbed by your body<</if>>, and then <<if canSee($activeSlave)>>looks at<<else>>turns to<</if>> you in shock as you sit down beside $him, ignoring the water soaking your clothes. $He does not resist when you draw $him gently into your lap. $He's stiff and uncomfortable as you hold $him gently, but $he eventually relaxes and allows $his head to rest <<if ($PC.boobs >= 300)>>between your breasts<<else>>against your shoulder<</if>>. $He's utterly conflicted; the hateful person who $he is expected to fuck is tenderly comforting $him. $He finally seems to accept the animal comfort, whatever its source, and begins to @@.mediumaquamarine;trust@@ you to do more than just use $him. - <<set $activeSlave.trust += 4>> - <</replace>> -<</link>> -<br><<link "Talk through $his problems with $him">> - <<replace "#result">> - You enter the bathroom and quietly wait until $he's done. When the water shuts off, $he stands up absently and spins so the shower's air dry function can blow the water off $him. (You can't help but notice - <<if ($activeSlave.weight > 30)>> - a lot of motion across $his - <<if $activeSlave.weight > 190>> - expansive - <<elseif $activeSlave.weight > 130>> - fat - <<elseif $activeSlave.weight > 95>> - thick - <<else>> - chubby - <</if>> - body when the air jets play across $him.) - <<elseif ($activeSlave.belly >= 5000)>> - how firm $his _belly belly is.) - <<elseif ($activeSlave.dick > 1)>> - $his soft cock flop around as one of the air jets strikes it.) - <<elseif ($activeSlave.boobs > 800)>> - <<if ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>> - how $his fake tits refuse to jiggle under the air jets.) - <<else>> - how the air jets produce a lot of delectable jiggling when they strike $his boobs.) - <</if>> - <<elseif ($activeSlave.butt > 4)>> - how $he has to spread $his big buttcheeks to let an air jet dry between them.) - <<elseif ($activeSlave.labia > 0)>> - how one of the air jets creates some motion in $his generous labia.) - <<elseif ($activeSlave.muscles > 5)>> - how the air jets make $his taut abs look even more impressive.) - <<else>> - $his nipples <<if $activeSlave.nipples != "fuckable">>stiffen<<else>>engorge<</if>> under the air jets.) - <</if>> - As $he rotates, <<if canSee($activeSlave)>>$he notices you with a start and looks concerned, but you do your best to look reassuring and beckon<<else>>you gently call $his name. $He jumps at the sound of your voice and looks concerned, but you do your best to calm $him and gingerly coax<</if>> $him out of the shower. - <br><br> - You ask $him what's troubling $him, and the look of concern returns. Suspecting that $he's afraid of telling the truth, you gently encourage $him to be honest, and assure $him that you're simply taking an interest in $his well-being. $He still hesitates, but eventually sniffles a little and - <<if !canTalk($activeSlave)>> - reluctantly gestures, - <<elseif SlaveStatsChecker.checkForLisp($activeSlave)>> - lisps, - <<else>> - admits, - <</if>> - <<if ($activeSlave.sexualFlaw == "hates oral") && ($activeSlave.counter.oral > 0)>> - "It'<<s>> nothing <<s>>pe<<c>>ial, <<Master>>. I ju<<s>>t h-hate getting fa<<c>>efucked." - <<elseif ($activeSlave.sexualFlaw == "hates anal") && ($activeSlave.counter.anal > 0)>> - "It'<<s>> nothing <<s>>pe<<c>>ial, <<Master>>. I ju<<s>>t h-hate getting a<<ss>>raped." - <<elseif ($activeSlave.sexualFlaw == "hates penetration") && ($activeSlave.counter.anal > 0)>> - "It'<<s>> nothing <<s>>pe<<c>>ial, <<Master>>. I ju<<s>>t h-hate getting fucked." - <<elseif ($activeSlave.behavioralFlaw == "hates women")>> - "<<S>>orry, <<Master>>. I ju<<s>>t h-hate girl<<s>>. They're gro<<ss>>." - <<elseif ($activeSlave.behavioralFlaw == "hates men")>> - "<<S>>orry, <<Master>>. I ju<<s>>t h-hate cock<<s>>. I don't want to <<s>>ee another one, ever again." - <<elseif ($activeSlave.sexualFlaw == "idealistic") && ($activeSlave.counter.oral > 0 || $activeSlave.counter.anal > 0 || $activeSlave.counter.vaginal > 0 || $activeSlave.counter.mammary > 0)>> - "I feel like I'm going cra<<z>>y, <<Master>>. No one here <<s>>eem<<s>> to know that rape i<<s>> wrong. Th-they ju<<s>>t r-rape me." - <<elseif ($activeSlave.sexualFlaw == "shamefast")>> - "I want to cover my<<s>>elf <<s>>o badly, <<Master>>. I'm <<s>>o embarra<<ss>>ed all the time. I'm <<s>>o tired of being embarra<<ss>>ed." - <<elseif ($activeSlave.sexualFlaw == "repressed") && ($activeSlave.counter.oral > 0 || $activeSlave.counter.anal > 0 || $activeSlave.counter.vaginal > 0 || $activeSlave.counter.mammary > 0)>> - "I'm filthy, <<Master>>. I've been u<<s>>ed, and I can't ever be clean again. I'm a d-dirty, <<s>>inful whore." - <<else>> - "<<S>>orry, <<Master>>. I wa<<s>> ju<<s>>t r-remembering, b-before — all thi<<s>>." - <</if>> - You tell $him kindly that you understand, and that $he'll be trained to address this. Then, you turn and go. $He's mystified; though $he's not overjoyed by the promise of correction, $he finds $himself @@.hotpink;less resistant@@ to following your plans. - <<set $activeSlave.devotion += 4>> - <</replace>> -<</link>> -<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>> - <br><<link "Use $him when $he gets out">> - <<replace "#result">> - Eventually $he finishes and switches the shower to dry. The airflow dries $him and $he steps out, but as $he does, $he's seized and flung over the countertop with a slap as $his naked, $activeSlave.skin <<if $activeSlave.belly >= 5000>> _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<<else>>skin<</if>> hits the surface. - <<if $activeSlave.vagina > -1 && !canDoVaginal($activeSlave)>> - With $his chastity belt protecting $his pussy, you ram <<if $PC.dick == 0>>your vibrating strap-on<<else>>yourself<</if>> up $his ass instead, drawing a pained sob. - <<elseif $activeSlave.vagina == -1>> - You ram <<if $PC.dick == 0>>your vibrating strap-on<<else>>yourself<</if>> up $his ass, drawing a pained sob. - <<elseif !canDoAnal($activeSlave)>> - You ram mercilessly into $his cunt, forcing a few gasps out of $him before it sinks in that this is happening. - <<else>> - You take $his silly cunt just long enough to force a few gasps out of $him before you pull out and ram <<if $PC.dick == 0>>your vibrating strap-on<<else>>yourself<</if>> up $his ass, drawing a pained sob. - <</if>> - As $he takes the pounding sullenly, <<if canSee($activeSlave)>>$he has a direct view of $his own eyes in the mirror, and clearly @@.gold;is disturbed by what $he sees.@@<<elseif canHear($activeSlave)>>$he can hear nothing but the sound of $his brutal rape, and clearly @@.gold;is disturbed by what $he hears.@@<<else>>$his blindness and deafness mean that one of the few things $he can feel is $his own rape, which @@.gold;disturbs $him to no end.@@<</if>> - <<set $activeSlave.trust -= 5>> - <<= VCheck.Both($activeSlave, 1)>> - <</replace>> - <</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>> -<</if>> - -<<case "resistant gelding">> - -<<link "Abuse $his ass">> - <<replace "#result">> - $He turns around as <<if canHear($activeSlave)>>$he hears <</if>>you enter the bathroom, fear and loathing on $his face, but you seize $his shoulder and spin $his back around without a word. You drag $him across the counter until $his face is over the sink, and turn it on. $He struggles in sheer incomprehension as you hold $his head over the filling basin with one hand and roughly grope $his butt with the other. When the sink is full, you tell $him to spread $his buttocks for you like a good butthole bitch. $He hesitates, so you push $his face under the surface of the water and hold it there until $he complies. You shove <<if $PC.dick == 0>>a dildo<<else>>your member<</if>> up $his anus so harshly that $he spasms and reflexively tries to get away, so you push $him under again until $he stops struggling. For the next ten minutes, $he gets shoved under water whenever $he offers the slightest resistance to anal rape. Soon, $his tears are pattering down into the sink. The next time you decide to buttfuck $him, $he's @@.gold;compliant from sheer terror.@@ - <<set $activeSlave.trust -= 5>> - <<= VCheck.Anal($activeSlave, 1)>> - <</replace>> -<</link>> -<br><<link "Reassure $him of $his sexual worth">> - <<replace "#result">> - $He turns around as <<if canHear($activeSlave)>>$he hears <</if>>you enter the bathroom, fear and loathing on $his face, but is surprised by <<if canSee($activeSlave)>>your gentle expression<<else>>by how calm your steps seem<</if>>. $He's more shocked still when you give $him a reassuring hug and kiss $his unresisting mouth. $He's so unable to figure out what's happening that $he eventually gives up and relaxes into you. You gently turn $him around to face the mirror again, and working from the top of $his head, describe $his body in minute detail, explaining how pretty and valuable a sex slave $he is. When you're about to reach $his butt, - <<if canTalk($activeSlave)>> - $he uses gestures to beg you not to assrape $him. - <<else>> - <<if ($activeSlave.lips > 70)>> - $he begs meekly through $his massive dick-sucking lips, - <<elseif ($activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2)>> - $he begs meekly through $his mouthful of piercings, - <<else>> - $he begs meekly, - <</if>> - "<<Master>>, plea<<s>>e, plea<<s>>e don't a<<ss>>rape me. I don't think I can take it." - <</if>> - You patiently explain that taking <<if $PC.dick == 0>>anything you feel like inserting into $his backdoor<<else>>your cock<</if>> is $his duty, and begin to massage $his sphincter open with a single gentle finger. $He doesn't enjoy the ensuing assfuck, but $he doesn't truly hate it either and @@.hotpink;begins to hope@@ that being your butt slave won't be so painful after all. - <<set $activeSlave.devotion += 4>> - <<= slaveSkillIncrease('anal', $activeSlave, 10)>> - <<= VCheck.Anal($activeSlave, 1)>> - <</replace>> -<</link>> -<br><<link "Comfort $him">> - <<replace "#result">> - $He turns around as <<if canHear($activeSlave)>>$he hears<</if>> you enter the bathroom, fear and loathing on $his face, but is surprised by <<if canSee($activeSlave)>>your gentle expression<<else>>by how calm your steps seem<</if>>. $He's more shocked still when you give $him a reassuring hug and kiss $his unresisting mouth. $He's so unable to figure out what's happening that $he eventually gives up and relaxes into you. You run your hands along $his body and kiss $his deeply for a long while before reassuring $him of $his value to you. $He looks confused, but goes about $his business with dry eyes. $He hates you a little less, but wonders whether $he can get away with retaining some independence. - <</replace>> -<</link>> - -<<case "rebellious arrogant">> - -<<link "Force $him out of bed and humiliate $him publicly">> - <<replace "#result">> - You drag $him unceremoniously out of bed and straight down into the public areas of $arcologies[0].name. $His struggles and protests grow more frantic as $he - <<set _textArray = []>> - <<if canSee($activeSlave)>> - <<set _textArray.push("sees the first passersby beginning to stare at the little spectacle")>> - <</if>> - <<if canHear($activeSlave)>> - <<set _textArray.push("begins to hear the various catcalls and other comments directed at $him")>> - <<else>> - <<set _textArray.push("feels the outdoor air on $his body")>> - <</if>> - <<if _textArray.length === 1>> - <<print _textArray[0] + ".">> - <<elseif _textArray.length === 2>> - <<print _textArray[0] + " and " + _textArray[1] + ".">> - <<elseif _textArray.length === 3>> - <<print _textArray[0] + ", " + _textArray[2] + " and " _textArray[3] + ".">> - <</if>> - You force $him right there, thoroughly raping the struggling $girl in public. @@.gold;$He learns the consequences of refusal,@@ - <<if $arcologies[0].FSDegradationist !== "unset">> - and @@.green;your citizens certainly enjoy the public spectacle.@@ - <<run repX(100, "event", $activeSlave)>> - <<else>> - but @@.red;your reputation has been decreased by the unseemly commotion.@@ - <<run repX(-100, "event", $activeSlave)>> - <</if>> - <<if canDoVaginal($activeSlave) && canDoAnal($activeSlave)>> - <<= VCheck.Both($activeSlave, 1)>> - <<elseif canDoVaginal($activeSlave)>> - <<= VCheck.Vaginal($activeSlave, 1)>> - <<elseif canDoAnal($activeSlave)>> - <<= VCheck.Anal($activeSlave, 1)>> - <<else>> - <<run seX($activeSlave, "oral", $PC, "penetrative")>> - <</if>> - <<set $activeSlave.trust -= 5>> - <</replace>> -<</link>><<if (($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave)))>> //This option will take $his virginity//<</if>> -<br><<link "Let $him stay in bed">> - <<replace "#result">> - You shrug and walk out of the room and back to your office; you've got more important things to worry about than some drowsy brat. $activeSlave.slaveName, for $his part, gets out of bed not long after you leave, but is surprised at @@.orangered;how easily $he got away with this,@@ and is wondering @@.mediumorchid;what else $he could get away with.@@ - <<set $activeSlave.trust += 10>> - <<set $activeSlave.devotion -= 10>> - <</replace>> -<</link>> -<<if $seePee == 1>> - <br><<link "Let $him stay in bed, but move it to a public restroom">> - <<replace "#result">> - You quickly pin the blanket to the mattress, securing $him in place. You direct that a urinal in one of $arcologies[0].name's public restrooms be unbolted and replaced by the mattress, slave and all. $He's been swearing and threatening all this time, but the calumny reaches a shrieking crescendo (though muffled by the blanket) when $he feels urine beginning to soak through the blanket. After an hour or so $he's begging to be let out, @@.gold;swearing $he'll improve $his conduct.@@ - <<set $activeSlave.trust -= 5>> - <</replace>> - <</link>> -<</if>> -<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>> - <br><<link "Let $him stay in bed, but move it to a whorehouse">> - <<replace "#result">> - You quickly pin the blanket to the mattress, securing $him in place. You direct that $he be brought to an arcology salon that serves as a slave brothel. Once $he's there, you take a pair of scissors and cut a slit through the sheets. $He's been swearing and threatening all this time, but the calumny reaches a shrieking crescendo when $he feels a cock being shoved through the slit and between $his buttocks. Being muffled and held immobile for rape for hire @@.gold;terrifies $him@@ but @@.yellowgreen;earns some cash.@@ - <<set $activeSlave.trust -= 5>> - <<if canDoVaginal($activeSlave)>> - <<run seX($activeSlave, "vaginal", "public", "penetrative", 5)>> - <<if canDoAnal($activeSlave)>> - <<run seX($activeSlave, "anal", "public", "penetrative", 5)>> - <<if $activeSlave.vagina == 0 && $activeSlave.anus == 0>> - After the patrons have their way with $him, @@.lime;both $his pussy and asshole have been broken in.@@ $He @@.mediumorchid;hates@@ losing $his virginities in such an undignified manner and @@.gold;fears@@ what will be taken from $him next. - <<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.vagina++, $activeSlave.anus++>> - <<elseif $activeSlave.vagina == 0>> - After the patrons have their way with $him, @@.lime;$he's certainly no longer a virgin.@@ $He @@.mediumorchid;hates@@ losing $his virginity in such an undignified manner and @@.gold;fears@@ what will be taken from $him next. - <<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.vagina++>> - <<elseif $activeSlave.anus == 0>> - After the patrons have their way with $him, @@.lime;$he's certainly no longer an anal virgin.@@ $He @@.mediumorchid;hates@@ losing $his anal virginity in such an undignified manner and @@.gold;fears@@ what will be taken from $him next. - <<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.anus++>> - <</if>> - <<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">> - <<run knockMeUp($activeSlave, 25, 2, -2)>> - <</if>> - <<else>> - <<if $activeSlave.vagina == 0>> - After the patrons have their way with $him, @@.lime;$he's certainly no longer a virgin.@@ $He @@.mediumorchid;hates@@ losing $his virginity in such an undignified manner and @@.gold;fears@@ what will be taken from $him next. - <<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.vagina++>> - <</if>> - <<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">> - <<run knockMeUp($activeSlave, 25, 0, -2)>> - <</if>> - <</if>> - <<elseif canDoAnal($activeSlave)>> - <<run seX($activeSlave, "anal", "public", "penetrative", 10)>> - <<if $activeSlave.anus == 0>> - After the patrons have their way with $him, @@.lime;$he's certainly no longer an anal virgin.@@ $He @@.mediumorchid;hates@@ losing $his anal virginity in such an undignified manner and @@.gold;fears@@ what will be taken from $him next. - <<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.anus++>> - <<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">> - <<run knockMeUp($activeSlave, 50, 1, -2)>> - <</if>> - <</if>> - <</if>> - <<run cashX(100, "event", $activeSlave)>> - <</replace>> - <</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>> -<</if>> -<<if $arcade > 0>> - <br><<link "Sentence $him to a month in the arcade">> - <<replace "#result">> - $activeSlave.slaveName screams and begs when $he realizes what $his punishment is, but you are obdurate. - <<if ($activeSlave.muscles > 30)>> - $His powerful form has to be sedated for immurement in the arcade. - <<elseif ($activeSlave.weight >= 190)>> - $He is so massively fat that immuring $him in the arcade is a struggle, even when $he isn't trying to. - <<elseif $activeSlave.belly >= 120000>> - $He is so enormously gravid that immuring $him in the arcade is a hassle, even though $his _belly middle limits $his ability to struggle. - <<elseif ($activeSlave.weight >= -10)>> - $His desperate struggles make immuring $him in the arcade difficult. - <<elseif $activeSlave.belly >= 1500>> - $His <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>_belly<</if>> body makes it slightly difficult to fit $him properly into the restraints for immurement in the arcade. - <<elseif $activeSlave.muscles < -15>> - $His weak body makes immuring $him in the arcade pathetically easy. - <<else>> - $His thin form makes immuring $him in the arcade pathetically easy. - <</if>> - After $he's properly confined, the only sign of $his discomfiture is a slight movement of $his $activeSlave.skin butt as $he wriggles desperately against $his restraints. - <<= assignJob($activeSlave, "be confined in the arcade")>> - <<set $activeSlave.sentence = 4>> - <</replace>> - <</link>> -<</if>> - <<case "vocal disobedience">> <<link "Give $him a rough spanking">> @@ -3584,224 +3053,23 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</replace>> <</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>> -<<case "cumslut whore">> +<<case "age implant">> -<<link "$He must have at least a little room left">> +<<link "Go out clubbing to make $him feel young again">> <<replace "#result">> - You call $activeSlave.slaveName in and ask how full $he is. $He looks confused for a moment but soon figures out what you mean. - <<if !canTalk($activeSlave) && (!hasAnyArms($activeSlave))>> - As a mute amputee $he communicates poorly, - <<if $activeSlave.inflationType == "cum">> - <<if $activeSlave.bellyFluid >= 10000>> - but $he sticks out $his hugely bloated cum-belly and opens wide, $his intent clear. - <<elseif $activeSlave.bellyFluid >= 5000>> - but $he wiggles around so $his cum-filled belly sloshes audibly before opening wide. - <<else>> - but $he sticks out $his cum-swollen belly and opens wide, $his intent clear. - <</if>> - <<else>> - but $he does manage to look hungry. - <</if>> - <<elseif !canTalk($activeSlave)>> - <<if $activeSlave.inflationType == "cum">> - <<if $activeSlave.bellyFluid >= 10000>> - $He strokes $his hugely bloated cum-belly, makes a sign for "never," and then makes a sign for "enough." - <<elseif $activeSlave.bellyFluid >= 5000>> - $He jiggles $his cum-filled belly lewdly, makes a sign for "need," and then makes a sign for "more." - <<else>> - $He pats $his cum-swollen belly, makes a sign for "much," and then makes a sign for "room." - <</if>> - <<else>> - $He gestures at $his<<if $activeSlave.belly >= 1500>> _belly<</if>> stomach, makes a sign for "full," and then makes a sign for "never." - <</if>> - <<else>> - <<if $activeSlave.inflationType == "cum">> - <<if $activeSlave.bellyFluid >= 10000>> - $He strokes $his hugely bloated cum-belly, "Oh <<Master>>, I've had <<s>>o much cum already today, but I can't help my<<s>>elf if you're offering me even more. I'll find <<s>>ome room in there," - <<elseif $activeSlave.bellyFluid >= 5000>> - $He jiggles $his cum-filled belly lewdly, "Oh <<Master>>, there'<<s>> <<s>>o much already in me, but I feel <<s>>o empty <<s>>till." - <<else>> - $He pats $his cum-swollen stomach, "Oh <<Master>>, thi<<s>> little belly i<<s>> nothing, I alway<<s>> have room for more," - <</if>> - <<else>> - "Oh <<Master>>, I'll never be full again," - <</if>> - $he <<say>>s<<if $activeSlave.lips > 70>> past $his enormous lips<<elseif $activeSlave.lipsPiercing+$activeSlave.tonguePiercing > 2>> past $his mouthful of piercings<</if>>. - <</if>> - $He comes eagerly over and sucks you off with enthusiasm. As you cum, $he orgasms quickly at the <<if canTaste($activeSlave)>>taste<<else>>feeling<</if>> of the stuff hitting $his mouth<<if $PC.balls >= 10>>, even as your load keeps flowing into $his gullet<<if $PC.balls >= 30>> steadily bloated the poor $girl<</if>><</if>>. - <<if !canTalk($activeSlave)>> - $He <<if !canTaste($activeSlave)>>(rather ironically) <</if>>signs that you taste great. + You call out to stop $him, and $he turns obediently to listen; you tell $him to take the day off and meet you that evening for a trip to $arcologies[0].name's most fashionable nightclub. You emphasize slightly that it's a place you prefer to enjoy with a young slave, and $his eyes widen a little at the implied compliment and challenge. Right at the proper time, $he arrives in your office wearing neon $activeSlave.hColor makeup to match $his hair, and a tiny iridescent club<<= $girl>> outfit of the same color. The hem of the skirt is barely low enough to conceal $him <<if ($activeSlave.dick > 0)>>dick<<elseif $activeSlave.vagina == -1>>total lack of private parts<<else>>pussy<</if>>, and it's backless. The front is held up by a halter around $his pretty neck, and is <<if ($activeSlave.boobs > 2000)>>specially tailored to cover $his massive tits<<elseif ($activeSlave.boobs > 1000)>>strained by $his big tits<<elseif ($activeSlave.boobs > 300)>>tightly filled by $his healthy tits<<else>>tight against $his flat chest<</if>><<if $activeSlave.belly >= 1500>> and _belly <<if $activeSlave.bellyPreg >= 1500>>pregnant <</if>>belly<</if>>. $He makes a gaudy and very fashionable spectacle, and in response to your <<if canSee($activeSlave)>>look<<elseif canHear($activeSlave)>>whistle<<else>>gentle poke<</if>> $he raises <<if (!hasAnyArms($activeSlave))>>the stumps of $his arms ever so slightly<<if (hasBothArms($activeSlave))>>both arms<<else>>$his arm<</if>> over $his head<</if>> and twirls, shimmying $his body deliciously. + "I hope they let me into the club without checking my I.D., <<Master>>," $he jokes, + for which $he receives a swat on $his rear as you head out. With the full day of rest, $he is full of vigor and ready to dance. $He eagerly heads out onto the floor with you, + <<if ($activeSlave.skill.entertainment >= 100)>> + masterfully moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, grabbing the attention of all the men and most of the women in $clubName. + <<elseif ($activeSlave.skill.entertainment > 60)>> + expertly moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, mesmerizing $his neighbors on the floor. + <<elseif ($activeSlave.skill.entertainment > 30)>> + skillfully moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, drawing a lustful gaze or two. <<else>> - "<<Master>>, you ta<<s>>te great," $he <<if !canTaste($activeSlave)>>(rather ironically) <</if>>purrs. + clumsily moving <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> $his body to the heavy beat, attracting little notice among the press of novices. <</if>> - @@.mediumaquamarine;$He has become more trusting@@ in your willingness to give $him what $he wants. - <<set $activeSlave.trust += 4>> - <<run seX($activeSlave, "oral", $PC, "penetrative")>> - <</replace>> -<</link>> -<br><<link "Cum in $his mouth all night">> - <<replace "#result">> - You've had a busy day, so you've been unusually remiss in fucking your slaves. Naturally, this means you'll be spending the evening wandering around your home using your living sexual appliances. $activeSlave.slaveName is instructed to follow you and assist. $He's tired, so <<if (!hasAnyArms($activeSlave))>>you bring <<if (isAmputee($activeSlave))>>$his limbless torso<<else>>$him<</if>> along as a cum receptacle. Whenever you're about to finish in another slave, you pull out and fill $his mouth instead.<<else>>you let $him tag meekly along, masturbating gently as you use other slaves or just watching lazily. But whenever you're on the point of coming, you switch to $his mouth and let $him finish you with a few sucks and pumps of $his fatigued hand<<if (hasBothArms($activeSlave))>>s<</if>>.<</if>> By the time you put the exhausted $activeSlave.slaveName to bed $he's in a haze of cum-induced pleasure. @@.hotpink;$He has become more submissive to you.@@ - <<set $activeSlave.devotion += 4>> - <<run seX($activeSlave, "oral", $PC, "penetrative", 5)>> - <</replace>> -<</link>> -<<if (cumSlaves().length >= 5)>> - <br><<link "Give $him access to the Dairy's cockmilk">> - <<replace "#result">> - You let $him know you have a sexual accessory for $him to use. This isn't too unusual, so $he comes to your office without much anticipation. $He doesn't understand why you have an enormous sealed canister of fresh cum on your desk, but when you explain that it's $hers to play with on the job, $he starts to bounce with excitement. Not all of $his customers are interested in cum play, but quite a few are, and $he spends almost as much time cleaning up the gorgeous messes that get made as $he does making them. It's a valuable and @@.yellowgreen;profitable@@ whore who @@.hotpink;looks forward@@ to $his next customer. - <<set $activeSlave.devotion += 10>> - <<run cashX(random(500,1000), "event", $activeSlave)>> - <</replace>> - <</link>> -<</if>> - -<<case "loose buttslut">> - -<<link "Add something to fill $him completely">> - <<replace "#result">> - $He's so occupied that $he doesn't <<if canHear($activeSlave)>>hear you<<else>>sense your presence<</if>> until you<<if $PC.dick == 0>> don a strap-on and<</if>> tip $him over face forward. With $him on $his knees, $his dildo-stuffed ass is in the air; $he's still masturbating between $his legs. After a moment's consideration, you slide two exploratory fingers in alongside the dildo. $He gasps and masturbates harder. Thus encouraged, you shove <<if $PC.dick == 0>>the strap-on<<else>>your member<</if>> in alongside the dildo. <<if $activeSlave.voice != 0>>$He screams at the surprise double anal, sobbing and begging,<<else>>$He screams noiselessly at the surprise double anal, waving $his hands in distress,<</if>> but $he doesn't try to stop you and doggedly keeps rubbing. By the time you're finished $his asshole is a gaping hole much bigger than the average pussy. @@.hotpink;$He has become more submissive to you.@@ - <<set $activeSlave.devotion += 4>> - <<= VCheck.Anal($activeSlave, 1)>> - <</replace>> -<</link>> -<br><<link "Let $him use a machine">> - <<replace "#result">> - There's no reason for $him to do that in a quiet corner. You interrupt $him and bring $him into your office, setting $him up on a machine so $he can have that dildo rammed up $his ass for as long as $he likes. Your office is filled with the rhythmic sounds of a sloppy anus being pounded for a good long while. - <<if $assistant.personality > 0>> - The - <<switch $assistant.appearance>> - <<case "monstergirl">> - monstrous voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "take my cocks, slave." - <<case "shemale">> - sultry voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "take my dick, bitch." - <<case "amazon">> - aggressive voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "be a warrior." - <<case "businesswoman">> - dominant voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "stop struggling and be a good $girl." - <<case "goddess" "hypergoddess">> - calming voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "relax and accept what you deserve, $girl." - <<case "loli">> - young, naïve voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "relax, it'll get better." - <<case "preggololi">> - young voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "relax, you know it'll be fun!" - <<case "angel">> - harmonious voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "relax, it'll be over soon." - <<case "cherub">> - cheerful voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "relax, it'll feel better if you do!" - <<case "incubus">> - forceful voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "take my dick, cocksleeve, take it till you split!" - <<case "succubus">> - sultry voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "enjoy the pounding while it lasts." - <<case "imp">> - mischievous voice of your assistant's avatar can also be heard, mocking $activeSlave.slaveName, "your butthole is going to be so loose after this! You'll be nothing more than a used up whore!" - <<case "witch">> - uncertain voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "just relax and get it over with." - <<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">> - unclear voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "scream louder and let it fill your body completely." - <<case "schoolgirl">> - girly voice of your assistant's avatar can also be heard, encouraging $activeSlave.slaveName to "be quiet, or Teacher will hear us." - <<default>> - poor slave is taken to the very limit by your assistant. - <</switch>> - <<run seX($activeSlave, "anal", "assistant", "penetrative")>> - <<else>> - <<run actX($activeSlave, "anal")>> - <</if>> - By the time $he's climaxed out, $he's so tired and apathetic that $he can't bring $himself to get off it or ask for help, so $he just relaxes and enjoys the internal massage<<if $activeSlave.dick != 0>> while $his flaccid dick twitches weakly<</if>>. @@.mediumaquamarine;$He has become more trusting of you,@@ since you knew just what $he needed. - <<set $activeSlave.trust += 4>> - <</replace>> -<</link>> -<<if $HeadGirlID != 0 && $HeadGirlID != $activeSlave.ID>> - <br><<link "Call your Head Girl in for double anal">> - <<setLocalPronouns _S.HeadGirl 2>> - <<replace "#result">> - When _S.HeadGirl.slaveName comes into your office in response to your summons, _he2 finds $activeSlave.slaveName sitting in your lap with your <<if $PC.dick == 0>>strap-on<<else>>dick<</if>> up $his gaping butt<<if $PC.vagina != -1>><<if $PC.dick != 0>>, your bare pussy very visible at the base of your working cock<</if>><</if>>. _S.HeadGirl.slaveName's expression softens when _he2 realizes _he2's here for pleasure, not business. $activeSlave.slaveName gasps a little when $he <<if canHear($activeSlave)>>hears you tell _S.HeadGirl.slaveName to join you up $his asshole,<<else>>feels you pull apart $his asscheeks to make some room for _S.HeadGirl.slaveName,<</if>> but $he doesn't protest. - <<if ($activeSlave.chastityPenis == 1)>> - Since your poor Head Girl can't use _his2 caged cock, _he2 takes a dildo and shoves it up $activeSlave.slaveName's already-filled butt without further ado. - <<elseif canAchieveErection() && _S.HeadGirl.dick > 7>> - Even though your Head Girl is rock-hard and ready to fuck, _his2 cock is far too large to fit into even the most stretched slave's holes. Sighing, _he2 takes a dildo and shoves it up $activeSlave.slaveName's already-filled butt instead. - <<elseif canAchieveErection() && _S.HeadGirl.dick > 6>> - Your lusty Head Girl is already hard and forces _his2 oversized cock up $activeSlave.slaveName's already-filled butt while <<if $activeSlave.nipples != "fuckable">>tweaking<<else>>fingering<</if>> the moaning slave's nipples. - <<elseif (_S.HeadGirl.dick > 0) && (_S.HeadGirl.hormoneBalance >= 100)>> - Since your poor Head Girl can't get hard due to _his2 hormone therapy, _he2 dons a strap-on over _his2 flaccid penis and shoves it up $activeSlave.slaveName's already-filled butt without further ado. - <<elseif (_S.HeadGirl.dick > 0) && (_S.HeadGirl.balls > 0) && (_S.HeadGirl.ballType == "sterile")>> - Since your poor Head Girl can't get hard due to _his2 chemical castration, _he2 dons a strap-on over _his2 flaccid penis and shoves it up $activeSlave.slaveName's already-filled butt without further ado - <<elseif (_S.HeadGirl.dick > 0) && (_S.HeadGirl.balls == 0)>> - Since your poor Head Girl can't get hard due to _his2 orchiectomy, _he2 dons a strap-on over _his2 flaccid penis and shoves it up $activeSlave.slaveName's already-filled butt without further ado. - <<elseif !canAchieveErection(_S.HeadGirl) && _S.HeadGirl.dick > 6>> - Since your poor Head Girl is far too big to get hard, much to $activeSlave.slaveName's disappointment, _he2 dons a strap-on over _his2 flaccid penis and shoves it up $activeSlave.slaveName's already-filled butt without further ado. - <<elseif !canAchieveErection(_S.HeadGirl) && _S.HeadGirl.dick > 0>> - Since your poor Head Girl can't get it up for one reason or another, _he2 dons a strap-on over _his2 flaccid penis and shoves it up $activeSlave.slaveName's already-filled butt without further ado. - <<elseif _S.HeadGirl.dick > 0>> - Your lusty Head Girl is already hard and shoves _himself2 up $activeSlave.slaveName's already-filled butt while <<if $activeSlave.nipples != "fuckable">>tweaking<<else>>fingering<</if>> the writhing slave's nipples. - <<else>> - _He2 dons a strap-on and shoves it up $activeSlave.slaveName's already-filled butt without further ado. - <</if>> - The two of you jackhammer in and out of $activeSlave.slaveName's ass without mercy; the poor anal whore does $his best to relax, but two phalli at once is a lot, even for $him. $He's only allowed an anal respite when $his sphincter is really fucked out and there's little butthole fun to be had from $him any longer. $He has become @@.hotpink;more submissive to you,@@ and _S.HeadGirl.slaveName @@.hotpink;enjoyed@@ taking a break to fuck $him with you. - <<set $activeSlave.devotion += 4, _S.HeadGirl.devotion += 4>> - <<run seX($activeSlave, "anal", $PC, "penetrative")>> - <<run seX($activeSlave, "anal", _S.HeadGirl, "penetrative")>> - <<if canImpreg($activeSlave, $PC)>> - <<run knockMeUp($activeSlave, 5, 0, -1)>> - <</if>> - <<if canImpreg($activeSlave, _S.HeadGirl)>> - <<run knockMeUp($activeSlave, 5, 0, $HeadGirlID)>> - <</if>> - <</replace>> - <</link>> -<</if>> - -<<case "hormone dysfunction">> - -<<link "Give $him some vasodilators so $he can get relief">> - <<replace "#result">> - You give $him a shot and send $him on $his way. Within a few minutes it gives $him a raging hard-on that lasts for hours. $He spends every spare moment masturbating furiously. Of course, this is a temporary solution, and will just make the eventual return of $his problem more disappointing. @@.mediumorchid;$He is bitterly frustrated.@@ - <<set $activeSlave.devotion -= 5>> - <</replace>> -<</link>> -<br><<link "Sissy slave <<= $girl>>s don't need to climax to serve">> - <<replace "#result">> - You explain patiently that $he needs to stop focusing on getting off. $He's a sex slave, and what matters is that $he pleasures others. If $he doesn't climax $himself, that's unfortunate but not really significant. $He looks terribly forlorn, so to drive home the point you push $him down to the floor, give $him a rough facefuck, and send $him away with tousled hair, <<if $PC.dick == 0>>a tired tongue<<else>>a mouthful of ejaculate<</if>>, and the same limp dick as before. @@.mediumorchid;It's frustrating for $him.@@ - <<set $activeSlave.devotion -= 2>> - <<if ($activeSlave.clitSetting != $activeSlave.fetish)>> - But, $he slowly @@.lightcoral;accepts $his new role as a submissive little sex toy.@@ - <<set $activeSlave.fetishStrength = 65, $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10, $activeSlave.fetish = "submissive">> - <</if>> - <<run seX($activeSlave, "oral", $PC, "penetrative")>> - <</replace>> -<</link>> -<<if $activeSlave.prostate != 0 && canDoAnal($activeSlave)>> - <br><<link "Prostate stimulation ought to do the trick">> - <<replace "#result">> - You explain that $he will have to find a new way to climax to be a happy little shemale slut. As you do, you push $him against a wall and force $him up on tiptoe so that $his butt is conveniently positioned, and then ram <<if $PC.dick == 0>>a vibrating strap-on<<else>>yourself<</if>> up $his ass. $He squeals and dances against the wall on tiptoe, impaled on your <<if $PC.dick == 0>>fake cock<<else>>member<</if>>. $He doesn't climax to anal then, or the next time you assfuck $him, or the time after that; but some time later a long buttsex session ends when $he gives a little shake and a whimper and dribbles a pathetic squirt of cum from $his still-limp dick. By the end of the week @@.mediumaquamarine;$he's smiling trustingly@@ and offering you $his butt every chance $he gets. - <<= VCheck.Anal($activeSlave, 10)>> - <<set $activeSlave.trust += 4>> - <<if ($activeSlave.clitSetting != $activeSlave.fetish)>> - @@.lightcoral;$He's become a confirmed anal addict.@@ - <<set $activeSlave.fetishStrength = 65, $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10, $activeSlave.fetish = "buttslut">> - <</if>> - <</replace>> - <</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave))>> //This option will take $his virginity//<</if>> -<</if>> - -<<case "age implant">> - -<<link "Go out clubbing to make $him feel young again">> - <<replace "#result">> - You call out to stop $him, and $he turns obediently to listen; you tell $him to take the day off and meet you that evening for a trip to $arcologies[0].name's most fashionable nightclub. You emphasize slightly that it's a place you prefer to enjoy with a young slave, and $his eyes widen a little at the implied compliment and challenge. Right at the proper time, $he arrives in your office wearing neon $activeSlave.hColor makeup to match $his hair, and a tiny iridescent club<<= $girl>> outfit of the same color. The hem of the skirt is barely low enough to conceal $him <<if ($activeSlave.dick > 0)>>dick<<elseif $activeSlave.vagina == -1>>total lack of private parts<<else>>pussy<</if>>, and it's backless. The front is held up by a halter around $his pretty neck, and is <<if ($activeSlave.boobs > 2000)>>specially tailored to cover $his massive tits<<elseif ($activeSlave.boobs > 1000)>>strained by $his big tits<<elseif ($activeSlave.boobs > 300)>>tightly filled by $his healthy tits<<else>>tight against $his flat chest<</if>><<if $activeSlave.belly >= 1500>> and _belly <<if $activeSlave.bellyPreg >= 1500>>pregnant <</if>>belly<</if>>. $He makes a gaudy and very fashionable spectacle, and in response to your <<if canSee($activeSlave)>>look<<elseif canHear($activeSlave)>>whistle<<else>>gentle poke<</if>> $he raises <<if (!hasAnyArms($activeSlave))>>the stumps of $his arms ever so slightly<<if (hasBothArms($activeSlave))>>both arms<<else>>$his arm<</if>> over $his head<</if>> and twirls, shimmying $his body deliciously. - "I hope they let me into the club without checking my I.D., <<Master>>," $he jokes, - for which $he receives a swat on $his rear as you head out. With the full day of rest, $he is full of vigor and ready to dance. $He eagerly heads out onto the floor with you, - <<if ($activeSlave.skill.entertainment >= 100)>> - masterfully moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, grabbing the attention of all the men and most of the women in $clubName. - <<elseif ($activeSlave.skill.entertainment > 60)>> - expertly moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, mesmerizing $his neighbors on the floor. - <<elseif ($activeSlave.skill.entertainment > 30)>> - skillfully moving $his <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> body to the heavy beat, drawing a lustful gaze or two. - <<else>> - clumsily moving <<if $activeSlave.belly >= 1500>><<if $activeSlave.bellyPreg >= 1500>>gravid<<else>>rounded<</if>><</if>> $his body to the heavy beat, attracting little notice among the press of novices. - <</if>> - It doesn't take long for $him to back $himself into you so $he can grind; $he cranes $his neck back to plant an @@.hotpink;earnest kiss@@ on your chin. + It doesn't take long for $him to back $himself into you so $he can grind; $he cranes $his neck back to plant an @@.hotpink;earnest kiss@@ on your chin. <<set $activeSlave.devotion += 4>> <</replace>> <</link>> @@ -4236,71 +3504,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</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>> -<<case "devoted old">> - -<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>> - <<link "Cheer $him up">> - <<replace "#result">> - You close in on $him, and $he starts to present $himself with the force of long habit. However, you take $him by the hand and draw $him in close, running your fingertips along $his cheekbone, looking into $his <<= App.Desc.eyesColor($activeSlave)>>. <<if canSee($activeSlave)>>$He only holds your gaze for a brief moment before blushing and looking down again,<<else>>Once $he feels your hand stop, $he quickly glances down while<</if>> muttering another apology. You raise $his chin again with a gentle hand and give $him a deep kiss. After a moment $he hugs you with almost painful - <<if $activeSlave.belly >= 100000>> - fierceness, a feat given the size of $his _belly <<if $activeSlave.bellyPreg >= 3000>>gravid <</if>>belly, where - <<elseif $activeSlave.belly >= 5000>> - fierceness, pushing $his _belly <<if $activeSlave.bellyPreg >= 3000>>gravid <</if>>belly into yours, where - <<else>> - fierceness, and - <</if>> - you can feel a heat radiating from $him. $He makes to get down on $his knees to serve you again, but instead, you - <<if $activeSlave.belly >= 300000>> - help $him up and guide - <<elseif $activeSlave.belly >= 5000>> - gently scoop $him up and carry - <<else>> - scoop $him up and carry - <</if>> - $him to bed, laying the bemused $girl down before cuddling up behind $him. The two of you make languid love, with you <<if canHear($activeSlave)>>murmuring reassuringly into $his ear, <</if>>nibbling $his neck, cupping $his breasts,<<if $activeSlave.belly >= 1500>>rubbing $his distended midriff,<</if>> and massaging $his shoulders by turns. After a lovely climax together in $his - <<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>> - pussy $he coquettishly shifts $himself to line your recovering cock up with $his ass, - <<set _didVaginal = 1, _didAnal = 1>> - <<elseif canDoVaginal($activeSlave)>> - pussy $he coquettishly shifts $himself to face you, - <<set _didVaginal = 1>> - <<else>> - ass $he coquettishly shifts $himself to face you, - <<set _didAnal = 1>> - <</if>> - <<if canSee($activeSlave)>>looking with @@.hotpink;adoration@@ and new @@.mediumaquamarine;confidence@@ into your eyes<<else>>gazing with @@.hotpink;adoration@@ and new @@.mediumaquamarine;confidence@@ at your face<</if>>. - <<set $activeSlave.devotion += 4, $activeSlave.trust += 4>> - <<if _didVaginal == 1 && _didAnal == 1>> - <<= VCheck.Both($activeSlave, 1)>> - <<elseif _didVaginal == 1>> - <<= VCheck.Vaginal($activeSlave, 1)>> - <<elseif _didAnal == 1>> - <<= VCheck.Anal($activeSlave, 1)>> - <</if>> - <</replace>> - <</link>> -<</if>> -<br><<link "Perform a health exam personally">> - <<replace "#result">> - $He gets a weekly health exam from the automated systems, which also do their best to monitor $his well-being, but $he does not protest as you take $him to the surgery and give $him a <<if $PC.skill.medicine >= 100>>professional examination. It feels good to put the old skills to use on an attractive patient<<else>>thorough examination<</if>>. There's nothing the matter other than that $he hasn't been 18 for a long time. $He looks a little sad at some of the results, but whenever $he does, you place a hand on $his cheek and give $him a kiss. $He gets the idea. - "I under<<s>>tand, <<Master>>. I can <<s>>till <<s>>erve you," $he <<say>>s. - You adjust $his diet and exercise a little, which should @@.health.inc;slightly improve@@ $his health<<if $PC.skill.medicine >= 100>>, and prescribe some new supplements that might help $him @@.health.inc;feel $his best@@ all the time<<run improveCondition($activeSlave, 10)>><</if>>. As $he gets up from the chair and makes to resume $his duties, you give $him a light swat across the buttocks. $He squeaks and turns to @@.mediumaquamarine;giggle at you,@@ giving you a broad wink and shaking $his tits a little for you. - <<set $activeSlave.trust += 4>> - <<run improveCondition($activeSlave, 10)>> - <</replace>> -<</link>> -<<if _S.HeadGirl && $HeadGirlID != $activeSlave.ID>> - <br><<link "Give $him an afternoon off for some quality time with your Head Girl">> - <<setLocalPronouns _S.HeadGirl 2>> - <<replace "#result">> - _S.HeadGirl.slaveName understands the situation immediately. _He2 gets _himself2 and $activeSlave.slaveName dressed for a nice, non-sexual 'date' in $clubName, and leads $him out by the hand with a wink over _his2 shoulder to you. Your Head Girl understands just what kind of break from sexual servitude $activeSlave.slaveName really needs. They enjoy a nice meal, take a stroll and talk as friends, and get some inconsequential but relaxing beauty treatments together. They both @@.hotpink;enjoy the relaxation,@@ and $activeSlave.slaveName @@.health.inc;feels much better@@ after the rest, too. - <<set $activeSlave.devotion += 4>> - <<run cashX(forceNeg(500), "event", $activeSlave), improveCondition($activeSlave, 10)>> - <<set _S.HeadGirl.devotion += 4>> - <</replace>> - <</link>> //This option will cost <<print cashFormat(500)>>// -<</if>> - <<case "tendon fall">> <<link "Help $him clean $himself">> @@ -5338,425 +4541,16 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. on the floor in front of you. $He tries to spread $his butt and angle $his hips like a good $girl, but you slap $his hands away and push your <<if $PC.dick == 0>>strap-on<<else>>cock<</if>> inside $him without regard for $his poor anus. $He shudders and begins to cry, and keeps crying as you ravage $his asshole. When you climax and pull out, $he continues to weep, but stumbles off to wash. When $he comes back, $he's still sniffling, but without being prompted, <<if $activeSlave.belly >= 300000>> @@.hotpink;$he leans over $his belly and offers you $his sore butthole again.@@ - <<else>> - @@.hotpink;$he gets down on $his knees and offers you $his sore butthole again.@@ - <</if>> - <<set $activeSlave.trust -= 4, $activeSlave.devotion += 5>> - <<= VCheck.Anal($activeSlave, 1)>> - <</replace>> - <</link>> - </span> - <</replace>> -<</link>> - -<<case "desperately horny">> - -<<link "Touch $him enough to get $him off">> - <<replace "#result">> - You tell $him that $he deserves a reward for coming to you. $He almost bursts into tears and nods jerkily, unable to do anything else. You brush a finger across $his cheek, $his ear, $his lips; at each touch $he <<if !canTalk($activeSlave)>>breathes in sharply<<else>>gasps<</if>>. Moving around behind $him, you run a hand down $his flank to $his hip, and then around to $his<<if $activeSlave.belly >= 10000 || $activeSlave.bellyPreg >= 5000>> popped<</if>> navel, and up to cup $his breasts. Your run a thumb <<if $activeSlave.nipples != "fuckable">>over<<else>>into<</if>> each nipple, almost tipping $him over the edge. Your hands move down again, - <<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>> - spreading $his buttocks to tease $his clenched anus, and then forward across $his perineum. From there, you trace $his labia and end with a pinch of $his clit — and this is enough. - <<elseif canDoAnal($activeSlave)>> - spreading $his buttocks to tease $his clenched anus, and then forward across $his perineum — and this is enough. - <<elseif canDoVaginal($activeSlave)>> - tracing $his labia, and then forward to $his clit — and this is enough. - <<else>> - to give $his buttcheeks a rub down before teasing at $his chastity — and this is enough. - <</if>> - $He spasms, pitching forward - <<if $activeSlave.belly >= 300000>> - onto $his obscene belly. - <<else>> - and almost falling. - <</if>> - $He hurries to clean up after $himself, sobbing with relief and thanking you; $his submissiveness @@.hotpink;has increased.@@ - <<set $activeSlave.devotion += 4>> - <</replace>> -<</link>> -<<if ($activeSlave.fetishKnown == 1) && ($activeSlave.fetish != "none")>> - <br><<link "Reward $him for coming to you">> - <<setNonlocalPronouns $seeDicks>> - <<replace "#result">> - $He almost cries with relief when you tell $him to - <<switch $activeSlave.fetish>> - <<case "submissive">> - lie down on your desk on $his side in the fetal position. $He clambers up hurriedly and hugs $his knees<<if $activeSlave.belly >= 10000>> as best $he can with $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy <</if>>in the way<</if>>, spinning $himself around on the smooth surface so $his rear is pointing right at you. You stand up and pull $him over, $his $activeSlave.skin skin sliding across the cool glass desktop, until $his - <<if canDoAnal($activeSlave) && canDoVaginal($activeSlave)>> - butt is right at the edge of the desk. You warm yourself up with a pussy fuck before shifting your attention to $his neglected asshole. - <<= VCheck.Both($activeSlave, 3)>> - When you finish, you - <<elseif canDoAnal($activeSlave)>> - butt is right at the edge of the desk. - <<= VCheck.Anal($activeSlave, 3)>> - You give it a good fuck and then - <<elseif canDoVaginal($activeSlave)>> - pussy is right at the edge of the desk. - <<= VCheck.Vaginal($activeSlave, 3)>> - You give it a good fuck and then - <<else>> - mouth is right at the edge of the desk. You give it a good fuck and then - <<run seX($activeSlave, "oral", $PC, "penetrative", 3)>> - <</if>> - order $him brusquely to clean up and come right back. You use $him as a nice little desktop <<if $PC.dick != 0>>cockholster<<else>>sex toy<</if>> for the rest of the day. - <<case "cumslut">> - get under your desk and <<if $PC.dick != 0>>suck a dick<<if $PC.vagina != -1>> and eat a pussy<</if>><<else>>eat pussy<</if>> while you work. - <<if $activeSlave.belly >= 120000>> - As $his _belly belly bumps into you, you sigh and swivel your chair to the side; there is no way $he'll fit under there in $his bloated state. - <</if>> - $He's so horny that $he's barely got <<if $PC.dick != 0>>your cock into $his mouth<<else>>$his lips and tongue on your cunt<</if>> before $he climaxes spontaneously, shivering and moaning nicely. You keep $him down there for a while, doing light work and orgasming occasionally as $he gently <<if $PC.dick != 0>>blows you<<if $PC.vagina != -1>> and eats you out<</if>><<else>>lavishes attention on your wet vagina<</if>>. - <<run seX($activeSlave, "oral", $PC, "penetrative", 3)>> - <<case "humiliation">> - run an unimportant message to a citizen across $arcologies[0].name. Naked. $He blushes with mixed embarrassment and anticipation. $He's so pent up that before taking ten steps out of your penthouse entryway and towards $his objective, the open stares $his naked, horny body is getting push $him over the edge. - <<if ($activeSlave.chastityPenis == 1)>> - As $he <<if $activeSlave.belly >= 10000>>waddles<<else>>walks<</if>> along, $his chastity cage continues to stream precum. It spatters $his legs, making $his desperation completely obvious to anyone who looks at $his<<if $activeSlave.belly >= 150000>> from behind<</if>>. - <<elseif canAchieveErection($activeSlave)>> - $His rock hard cock, - <<if $activeSlave.belly >= 150000>> - forced down by the size of $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>stomach<</if>> as $he <<if $activeSlave.belly >= 10000>>waddles<<else>>walks<</if>> hurriedly along, jerks suddenly and shoots out a little squirt of cum down the underside of $his belly. - <<else>> - sticking straight forward as $he <<if $activeSlave.belly >= 10000>>waddles<<else>>walks<</if>> hurriedly along, jerks suddenly upward and shoots out a little squirt of cum<<if $activeSlave.belly >= 10000>> across the underside of $his <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<</if>>. - <</if>> - As $he stumbles forward, each step releases another squirt. - <<elseif ($activeSlave.dick > 0)>> - $His <<if $activeSlave.dick > 6>>enormous <</if>>soft cock, flopping around as $he <<if $activeSlave.belly >= 10000>>waddles<<else>>walks<</if>> hurriedly along, starts to twitch weakly and release little dribbles of cum. As $he stumbles forward, each step releases another squirt. - <<elseif $activeSlave.anus > 2>> - As $he stumbles a little with the orgasm, $his <<if canDoAnal($activeSlave)>>naked anus is easily visible from behind $him, and its lewd spasms attract attention<<else>>anus lewdly spasms under $his chastity, and $his odd motions attract attention<</if>>. - <<elseif canDoVaginal($activeSlave)>> - $He focuses $his attention on $his pussy, awkwardly stumbling along as $he tries to walk and finger $himself at the same time. - <<elseif canDoAnal($activeSlave)>> - $He focuses $his attention on $his asspussy, awkwardly stumbling along as $he tries to walk and play with $his own butt at the same time. - <<elseif $activeSlave.vagina > 0>> - $He squirts a little femcum down $his inner thighs as $he stumbles along, trailing the odor of a woman's pleasure behind $him. - <<else>> - $He focuses $his attention on $his breasts, awkwardly stumbling along as $he tries to walk and <<if $activeSlave.nipples != "fuckable">>tweak<<else>>finger<</if>> $his own nipples at the same time. - <</if>> - Passersby point and laugh, thrilling $him. - <<case "buttslut">> - sit on your lap. - <<if canDoAnal($activeSlave)>> - $He climaxes the instant your <<if $PC.dick != 0>>dickhead<<else>>strap-on<</if>> touches $his <<if $activeSlave.anus > 2>>anal gape<<else>>pucker<</if>>, but $he knows this is just the start, and $he laughs with pleasure as $his <<if $activeSlave.anus > 2>>lewd sphincter loosely squeezes<<else>>sphincter tightens against<</if>> the base of <<if $PC.dick != 0>>your cock<<else>>the strap-on<</if>>. You - <<if $activeSlave.belly >= 5000>> - spread your legs more and shove the<<if $activeSlave.bellyPreg >= 3000>>pregnant, <</if>>giggling buttslut down so $his _belly belly and chest are between your legs, lower your chair a little, and slide yourself back towards your desk to work. - <<else>> - shove the giggling buttslut down so $his chest is resting against the tops of your legs, lower your chair a little, and slide yourself back towards your desk to work. - <</if>> - $He wraps $his legs around the back of the chair and hugs your knees with $his arms, securing $himself - <<if $activeSlave.belly >= 100000>> - to you as an anal cocksleeve for as long as you feel like keeping <<if $PC.dick != 0>>your penis lodged up a compliant butthole<<else>>the happy buttslut nice and full<</if>>. - <<else>> - under the desk as an anal cocksleeve for as long as you feel like keeping <<if $PC.dick != 0>>your penis lodged up a compliant butthole<<else>>the happy buttslut trapped under there<</if>>. - <</if>> - <<= VCheck.Anal($activeSlave, 1)>> - <<else>> - $He climaxes the instant your <<if $PC.dick != 0>>dickhead<<else>>strap-on<</if>> squeezes between $his - <<if $activeSlave.butt < 2>> - flat, tight cheeks, - <<elseif $activeSlave.butt <= 2>> - cute cheeks, - <<elseif $activeSlave.butt <= 3>> - round, firm cheeks, - <<elseif $activeSlave.butt <= 4>> - curvy, enticing buttcheeks, - <<elseif $activeSlave.butt <= 5>> - huge cheeks, - <<elseif $activeSlave.butt <= 6>> - massive, alluring cheeks, - <<elseif $activeSlave.butt <= 7>> - enormous cheeks, - <<elseif $activeSlave.butt <= 10>> - gigantic, jiggly cheeks, - <<elseif $activeSlave.butt <= 14>> - inhuman, cushiony butt cheeks, - <<elseif $activeSlave.butt <= 20>> - couch-like, super jiggly ass cheeks, - <</if>> - but $he knows this is just the start, and $he laughs with pleasure as hug $his rear around <<if $PC.dick != 0>>your cock<<else>>the strap-on<</if>>. You - <<if $activeSlave.belly >= 5000>> - spread your legs more and shove the<<if $activeSlave.bellyPreg >= 3000>>pregnant, <</if>>giggling buttslut down so $his _belly belly and chest are between your legs, lower your chair a little, and slide yourself back towards your desk to work. - <<else>> - shove the giggling buttslut down so $his chest is resting against the tops of your legs, lower your chair a little, and slide yourself back towards your desk to work. - <</if>> - $He wraps $his legs around the back of the chair and hugs your knees with $his arms, securing $himself - <<if $activeSlave.belly >= 100000>> - to you as an a cockbun for as long as you feel like keeping <<if $PC.dick != 0>>your penis wrapped in a happy buttslut<<else>>the happy buttslut entertained<</if>>. - <<else>> - under the desk as a cockbun for as long as you feel like keeping the happy buttslut trapped under there. - <</if>> - under the desk as cockbun for as long as you feel like keeping the happy buttslut trapped under there. - <</if>> - <<case "boobs">> - lie atop your desk. You don't bother specifying that $he's to lie on $his back, since the boob slut jumps up and presents $his tits without instructions. You keep working with one hand while you idly tease and <<if $activeSlave.nipples != "fuckable">>flick<<else>>finger<</if>> the nearest <<if $activeSlave.lactation > 0>>milky <</if>> nipple with the other. $He's so horny that $he immediately experiences an immodest orgasm, $his back arching away from the cool glass desktop as $he rides its waves. $He giggles a little, and then gasps as you resume playing with $him. - <<run seX($activeSlave, "mammary", $PC, "penetrative")>> - <<if $activeSlave.lactation > 0>> - <<set $activeSlave.lactationDuration = 2>> - <<set $activeSlave.boobs -= $activeSlave.boobsMilk, $activeSlave.boobsMilk = 0>> - <<else>> - <<= induceLactation($activeSlave, 4)>> - <</if>> - <<case "pregnancy">> - <<if !canDoAnal($activeSlave) && !canDoVaginal($activeSlave)>> - join you on the couch. Since <<if ($activeSlave.vagina >= 0)>>you're saving $his pussy<<else>>this slave $girl doesn't have a pussy<</if>>, and $his tight little rosebud is off limits, your options are a bit limited. But you work with what you have, playing with $his - <<if isFertile($activeSlave)>> - <<if $activeSlave.lactation == 0>> - nipples and describing in whispers how pregnancy would make them drip with cream. - <<else>> - breasts and describing in whispers how big they'll swell if $he got pregnant. - <</if>> - <<elseif $activeSlave.preg > $activeSlave.pregData.normalBirth/2>> - <<if $activeSlave.lactation == 1>> - nipples and describing in whispers how nice and swollen $he is with milk. - <<else>> - breasts and describing in whispers how big $he's gotten since $he got pregnant. - <</if>> - <<elseif $activeSlave.preg > 0>> - <<if $activeSlave.lactation == 0>> - nipples and describing in whispers how $his pregnancy will soon have them drip with cream. - <<else>> - breasts and describing in whispers how $his pregnancy will soon swell them to feed $his child<<if $activeSlave.pregType > 1>>ren<</if>>. - <</if>> - <<else>> - <<if $activeSlave.lactation == 0>> - nipples and describing in whispers how they'd drip with cream if only $he could get pregnant. - <<else>> - breasts and describing in whispers how big they'd swell if only $he could get pregnant. - <</if>> - <</if>> - $He gasps and shudders against you. - <<run seX($activeSlave, "mammary", $PC, "penetrative")>> - <<elseif ($activeSlave.anus == 0) && ($activeSlave.vagina <= 0)>> - join you on the couch. Since <<if ($activeSlave.vagina == 0)>>$he's a virgin and you haven't elected to introduce $him to pussyfucking just yet<<else>>this slave $girl doesn't have a pussy<</if>>, and $his tight little rosebud is fresh and unspoiled, your options are a bit limited. But you work with what you have, playing with $his - <<if isFertile($activeSlave)>> - <<if $activeSlave.lactation == 0>> - nipples and describing in whispers how pregnancy would make them drip with cream. - <<else>> - breasts and describing in whispers how big they'll swell if $he got pregnant. - <</if>> - <<elseif $activeSlave.preg > $activeSlave.pregData.normalBirth/2>> - <<if $activeSlave.lactation == 1>> - nipples and describing in whispers how nice and swollen $he is with milk. - <<else>> - breasts and describing in whispers how big $he's gotten since $he got pregnant. - <</if>> - <<elseif $activeSlave.preg > 0>> - <<if $activeSlave.lactation == 0>> - nipples and describing in whispers how $his pregnancy will soon have them drip with cream. - <<else>> - breasts and describing in whispers how $his pregnancy will soon swell them to feed $his child<<if $activeSlave.pregType > 1>>ren<</if>>. - <</if>> - <<else>> - <<if $activeSlave.lactation == 0>> - nipples and describing in whispers how they'd drip with cream if only $he could get pregnant. - <<else>> - breasts and describing in whispers how big they'd swell if only $he could get pregnant. - <</if>> - <</if>> - $He gasps and shudders against you. - <<run seX($activeSlave, "mammary", $PC, "penetrative")>> - <<elseif $activeSlave.pregKnown == 1>> - join you on the couch. <<if $PC.dick != 0>>You orgasm inside $him promptly, and then tell $him you'll be leaving your seed inside $him to do its work while you have $him again.<<else>>You use a strap-on with a fluid reservoir, and you trigger it promptly, releasing a gush of warm fluid into $him. You tell $him you'll be leaving it inside $him to do its work while you have $him again.<</if>> $He gasps at the appeal of the idea and grinds $himself against you hungrily. - <<if !canDoVaginal($activeSlave)>> - <<if $activeSlave.mpreg == 1>> - $He's already pregnant, but that doesn't disrupt $his fantasy of being even more pregnant. - <<else>> - It's $his butt you're fucking, but that doesn't disrupt $his fantasy. - <</if>> - <<= VCheck.Anal($activeSlave, 1)>> - <<else>> - $He's already pregnant, but that doesn't disrupt $his fantasy of being even more pregnant. - <<= VCheck.Vaginal($activeSlave, 1)>> - <</if>> - <<else>> - join you on the couch. <<if $PC.dick != 0>>You orgasm inside $him promptly, and then tell $him you'll be leaving your seed inside $him to do its work while you have $him again.<<else>>You use a strap-on with a fluid reservoir, and you trigger it promptly, releasing a gush of warm fluid into $him. You tell $him you'll be leaving it inside $him to do its work while you have $him again.<</if>> $He gasps at the appeal of the idea and grinds $himself against you hungrily. - <<if !canDoVaginal($activeSlave)>> - <<if $activeSlave.mpreg == 1>> - $He's eager to get pregnant and intends to put $his asspussy to use. - <<else>> - It's $his butt you're fucking, but that doesn't disrupt $his fantasy. - <</if>> - <<= VCheck.Anal($activeSlave, 1)>> - <<else>> - $He's eager to get pregnant and intends to put $his pussy to use. - <<= VCheck.Vaginal($activeSlave, 1)>> - <</if>> - <</if>> - <<case "dom">> - wait a moment, because you know what $he needs. $He's mystified, but steels $himself and waits. Another slave appears for an inspection, and _heU discovers that _heU's to be inspected with $activeSlave.slaveName's <<if canPenetrate($activeSlave)>>cock up _hisU asshole<<else>>fingers assfucking _himU<</if>>. The dominant $activeSlave.slaveName climaxes immediately to $his use of the poor slave, rubbing <<if $activeSlave.belly >= 5000>>$his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<<else>>$himself<</if>> all over the other slave's buttocks while $he continues banging _hisU backdoor. - <<run seX($activeSlave, "penetrative", "slaves", "anal")>> - <<case "sadist">> - wait a moment, because you know what $he needs. $He's mystified, but steels $himself and waits. Another slave appears for a trivial punishment, and _heU discovers that _heU's to be punished by $activeSlave.slaveName's <<if canPenetrate($activeSlave)>>dick<<else>>fingers<</if>>, forced up _hisU anus. The dominant $activeSlave.slaveName climaxes quickly, but quickly recovers and keeps assraping the poor _girlU. - <<run seX($activeSlave, "penetrative", "slaves", "anal")>> - <<case "masochist">> - get $his ass up on your desk and - <<if $activeSlave.belly >= 300000>> - lie off the side atop $his _belly stomach. - <<elseif $activeSlave.belly < 1500>> - lie on $his side. - <<else>> - lie face-down. - <</if>> - $He <<if $activeSlave.belly >= 10000>>struggles to heft $his <<if $activeSlave.bellyPreg >= 3000>>gravid <</if>>body<<else>>clambers<</if>> up, and you let $his lie there for a while, tortured by anticipation and arousal, before giving $his nearest buttock a harsh open-handed slap. The shock and pain send $him over the edge immediately, and $he grinds forward into the desk involuntarily; the feeling of the cool desk against $his <<if ($activeSlave.dick > 0)>>dickhead<<elseif $activeSlave.vagina == -1>>crotch<<else>>mons<</if>> slams $him into a second climax, and $he sobs with overstimulation. You keep $him there for a good long while, using $him as a desktop toy that makes interesting noises when you hit it. - <</switch>> - <<if ($activeSlave.fetishStrength > 95)>> - Since $he's totally sure of what gets $him off, this proof you know it too makes $him @@.mediumaquamarine;trust you.@@ - <<set $activeSlave.trust += 5>> - <<else>> - Since $he's developing $his kinks, this reinforcement of $his sexual identity @@.lightcoral;advances $his fetish.@@ - <<set $activeSlave.fetishStrength += 4>> - <</if>> - <</replace>> - <</link>><<if (canDoVaginal($activeSlave) && $activeSlave.vagina == 0) || (canDoAnal($activeSlave) && $activeSlave.anus == 0)>> //This option may take $his virginity//<</if>> -<</if>> -<br>Let $him get off: -<<if ($activeSlave.fetish != "cumslut") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>> - <br> <<link "while $he sucks">> - <<replace "#result">> - You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. From now on, $he can come to you and ask to <<if $PC.dick == 0>>perform cunnilingus on you<<else>>blow you<<if $PC.vagina != -1>> and eat you out<</if>><</if>>, and masturbate while $he does. $He nods through $his tears and hurriedly gets to $his knees, gagging in $his clumsy eagerness, crying a little with relief as $he masturbates furiously<<if $PC.vagina != -1>><<if $PC.dick != 0>> and does $his best to simultaneously please both a cock and a cunt with only one mouth<</if>><</if>>. $He doesn't even pause after $his first orgasm; $his acceptance of sexual slavery @@.hotpink;has increased.@@ - <<set $activeSlave.devotion += 4>> - <<run seX($activeSlave, "oral", $PC, "penetrative", 5)>> - <<if ($activeSlave.fetish == "cumslut") && ($activeSlave.fetishKnown == 1)>> - <<set $activeSlave.fetishStrength += 4>> - @@.lightcoral;$His enjoyment of <<if $PC.dick == 0>>giving head<<else>>sucking cock<</if>> has increased.@@ - <<elseif random(1,100) > 50>> - <<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "cumslut", $activeSlave.fetishKnown = 1>> - Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of <<if $PC.dick == 0>>giving head<<else>>sucking cock<</if>>.@@ - <</if>> - <</replace>> - <</link>> -<</if>> -<<if ($activeSlave.fetish != "boobs") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>> - <br> <<link "during nipple play">> - <<replace "#result">> - You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. From now on, $he can come to you and offer you $his breasts; $he will be allowed to masturbate while you do. $He nods through $his tears and hurriedly presents $his chest, crying a little with relief as $he feels <<if $activeSlave.nipples != "fuckable">>you nip a nipple with your teeth<<elseif $PC.dick != 0>>your dick slip into a nipple<<else>>your tongue penetrate into $his nipple<</if>>. $He masturbates furiously, not even pausing after $his first orgasm; $his acceptance of sexual slavery @@.hotpink;has increased.@@ - <<set $activeSlave.devotion += 4>> - <<run seX($activeSlave, "mammary", $PC, "penetrative", 5)>> - <<if ($activeSlave.fetish == "boobs") && ($activeSlave.fetishKnown == 1)>> - <<set $activeSlave.fetishStrength += 4>> - @@.lightcoral;$His enjoyment of breast play has increased.@@ - <<elseif random(1,100) > 50>> - <<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "boobs", $activeSlave.fetishKnown = 1>> - Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at every brush against $his breasts.@@ - <</if>> - <</replace>> - <</link>> -<</if>> -<<if (($activeSlave.fetish != "pregnancy") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)) && canDoVaginal($activeSlave)>> - <br> <<link "during insemination play">> - <<replace "#result">> - You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, $he can come to you and offer you $his <<if ($activeSlave.vagina > 3)>>hopelessly gaped pussy<<elseif ($activeSlave.vagina > 2)>>loose pussy<<elseif ($activeSlave.vagina > 1)>>nice pussy<<else>>tight pussy<</if>>; $he will be allowed to masturbate while you fill $him with cum. $He nods through $his tears and <<if $activeSlave.belly >= 10000>>struggles to get<<else>>hurriedly gets<</if>> up on your desk, lying on $his side and using one hand to spread $his buttocks apart while the other is poised to touch $himself. $He starts crying a little with relief as $he feels you slowly insert <<if $PC.dick == 0>>a spurting strap-on<<else>>your cock<</if>> into $his spasming cunt. $He masturbates furiously, not even pausing after $his first orgasm; $his acceptance of sexual slavery @@.hotpink;has increased.@@ - <<= VCheck.Vaginal($activeSlave, 5)>> - <<set $activeSlave.devotion += 4>> - <<if ($activeSlave.fetish == "pregnancy") && ($activeSlave.fetishKnown == 1)>> - <<set $activeSlave.fetishStrength += 4>> - @@.lightcoral;$His enjoyment of pregnancy play has increased.@@ - <<elseif random(1,100) > 50>> - <<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "pregnancy", $activeSlave.fetishKnown = 1>> - Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of getting pregnant.@@ - <</if>> - <</replace>> - <</link>><<if ($activeSlave.vagina == 0)>> //This option will take $his virginity//<</if>> -<</if>> -<<if ($activeSlave.fetish != "buttslut") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>> - <<if canDoAnal($activeSlave)>> - <br> <<link "while $he takes it up the ass">> - <<replace "#result">> - You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, $he can come to you and offer you $his <<if ($activeSlave.anus > 3)>>hopelessly gaped rectum<<elseif ($activeSlave.anus > 2)>>big slit of an asspussy<<elseif ($activeSlave.anus > 1)>>nice asspussy<<else>>tight asshole<</if>>; $he will be allowed to masturbate while you buttfuck $him. $He nods through $his tears and <<if $activeSlave.belly >= 10000>>struggles to get<<else>>hurriedly gets<</if>> up on your desk, lying on $his side and using one hand to spread $his buttocks apart while the other is poised to touch $himself. $He starts crying a little with relief as $he feels you slowly insert <<if $PC.dick == 0>>a strap-on<<else>>your cock<</if>> into $his spasming rectum. $He masturbates furiously, not even pausing after $his first orgasm; $his acceptance of sexual slavery @@.hotpink;has increased.@@ - <<= VCheck.Anal($activeSlave, 5)>> - <<set $activeSlave.devotion += 4>> - <<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>> - <<set $activeSlave.fetishStrength += 4>> - @@.lightcoral;$His enjoyment of anal has increased.@@ - <<elseif random(1,100) > 50>> - <<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "buttslut", $activeSlave.fetishKnown = 1>> - Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of anal sex.@@ - <</if>> - <</replace>> - <</link>><<if ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>> - <</if>> -<</if>> -<<if ($activeSlave.fetish != "humiliation") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>> - <br> <<link "in public">> - <<replace "#result">> - You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, $he can masturbate in public, sitting with $his legs spread for as much exposure as possible. $He nods through $his tears and sprints out of your office, dripping as $he goes. $He throws $himself to the ground outside, to the considerable amusement of passersby, spreading $his legs painfully wide. $He masturbates furiously, not even pausing after $his first orgasm; $his acceptance of sexual slavery @@.hotpink;has increased.@@ - <<set $activeSlave.devotion += 4>> - <<if ($activeSlave.fetish == "humiliation") && ($activeSlave.fetishKnown == 1)>> - <<set $activeSlave.fetishStrength += 4>> - @@.lightcoral;$His enjoyment of humiliation has increased.@@ - <<elseif random(1,100) > 50>> - <<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "humiliation", $activeSlave.fetishKnown = 1>> - Before $he realizes what's happening, @@.lightcoral;$he's starting to long for humiliation.@@ - <</if>> - <</replace>> - <</link>> -<</if>> -<<if ($activeSlave.fetish != "submissive") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>> - <br> <<link "after submitting to you">> - <<replace "#result">> - You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. - <<if canDoVaginal($activeSlave)>> - For the rest of the week, $he can come to you and offer you $his <<if ($activeSlave.vagina > 3)>>hopelessly loose pussy<<elseif ($activeSlave.vagina > 2)>>big slit of a pussy<<elseif ($activeSlave.vagina > 1)>>nice pussy<<else>>tight pussy<</if>>; $he will be allowed to masturbate after, but only after, you are finished with $him. $He nods through $his tears and <<if $activeSlave.belly >= 10000>>struggles to get<<else>>hurriedly gets<</if>> up on your desk, lying on $his side and using one hand to spread $his nether lips apart while the other is poised to touch $himself. $He starts crying a little with relief as $he feels you slowly insert <<if $PC.dick == 0>>a strap-on<<else>>your cock<</if>> into $his spasming vagina. You are not gentle, and despite the stimulation $he does not orgasm by the time you <<if $PC.dick == 0>>climax to the vibrations of the strap-on, and the pleasure of buttfucking a bitch<<else>>blow your load in $his ass<</if>>. $He's so eager to get off $he doesn't bother to move, and just - <<if $activeSlave.belly >= 1500>> - snakes a hand down to fondle $himself. - <<else>> - rolls onto $his face to hump $himself against $his hand, against the desk. - <</if>> - <<if $PC.dick == 0>>After the momentary pause of your climax, you<<if $PC.vagina != -1>> use a little manual stimulation of your pussy to force yourself to total hardness again and<</if>> resume thrusting<<else>>Your cum leaks out of $his used cunt and onto $his working hand<</if>>; $his acceptance of sexual slavery @@.hotpink;has increased.@@ - <<= VCheck.Vaginal($activeSlave, 5)>> - <<elseif canDoAnal($activeSlave)>> - For the rest of the week, $he can come to you and offer you $his <<if ($activeSlave.anus > 3)>>hopelessly gaped rectum<<elseif ($activeSlave.anus > 2)>>big slit of an asspussy<<elseif ($activeSlave.anus > 1)>>nice asspussy<<else>>tight asshole<</if>>; $he will be allowed to masturbate after, but only after, you are finished with $him. $He nods through $his tears and <<if $activeSlave.belly >= 10000>>struggles to get<<else>>hurriedly gets<</if>> up on your desk, lying on $his side and using one hand to spread $his buttocks apart while the other is poised to touch $himself. $He starts crying a little with relief as $he feels you slowly insert <<if $PC.dick == 0>>a strap-on<<else>>your cock<</if>> into $his spasming rectum. You are not gentle, and despite the anal stimulation $he does not orgasm by the time you <<if $PC.dick == 0>>climax to the vibrations of the strap-on, and the pleasure of buttfucking a bitch<<else>>blow your load in $his ass<</if>>. $He's so eager to get off $he doesn't bother to move, and just - <<if $activeSlave.belly >= 1500>> - snakes a hand down to fondle $himself. - <<else>> - rolls onto $his face to hump $himself against $his hand, against the desk. - <</if>> - <<if $PC.dick == 0>>After the momentary pause of your climax, you<<if $PC.vagina != -1>> use a little manual stimulation of your pussy to force yourself to total hardness again and<</if>> resume thrusting<<else>>Your cum leaks out of $his used backdoor and onto $his working hand<</if>>; $his acceptance of sexual slavery @@.hotpink;has increased.@@ - <<= VCheck.Anal($activeSlave, 5)>> - <<else>> - For the rest of the week, $he can come to you and politely ask to <<if $PC.dick != 0>>suck you off<<else>>eat you out<</if>>; $he will be allowed to masturbate after, but only after, you are satisfied. $He nods through $his tears and - <<if $activeSlave.belly >= 300000>> - leans over $his _belly stomach, - <<else>> - <<if $activeSlave.belly >= 10000>> - struggles - <<else>> - hurriedly gets - <</if>> - to $his knees, - <</if>> - where $he brings $his face to your <<if $PC.dick != 0>>erect cock<<else>>moist pussy<</if>> and $his hand to $his crotch. $He starts crying a little with relief as $he feels you slowly <<if $PC.dick == 0>>push your slit against<<else>>insert your cock into<</if>> $his mouth. You are not gentle, and by the time you <<if $PC.dick != 0>>blow your load down $his throat<<else>>splash $his face with your girlcum<</if>>, $he still hasn't reached $his climax. $He's so eager to get off $he doesn't bother to move, and just humps $himself against $his hand, against - <<if $activeSlave.belly >= 300000>> - $his belly. - <<else>> - your leg. - <</if>> - <<if $PC.dick == 0>>After the momentary pause of your climax, you<<if $PC.vagina != -1>> use a little manual stimulation of your pussy to force yourself to total hardness again and<</if>> resume thrusting<<else>>After the momentary pause of your climax, you pull $his face back to your crotch for a second round<</if>>; $his acceptance of sexual slavery @@.hotpink;has increased.@@ - <<run seX($activeSlave, "oral", $PC, "penetrative", 5)>> - <</if>> - <<set $activeSlave.devotion += 4>> - <<if ($activeSlave.fetish == "submissive") && ($activeSlave.fetishKnown == 1)>> - <<set $activeSlave.fetishStrength += 4>> - @@.lightcoral;$His enjoyment of submission has increased.@@ - <<elseif random(1,100) > 50>> - <<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "submissive", $activeSlave.fetishKnown = 1>> - Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of submission.@@ - <</if>> - <</replace>> - <</link>><<if (canDoVaginal($activeSlave) && $activeSlave.vagina == 0) || (canDoAnal($activeSlave) && $activeSlave.anus == 0)>> //This option may take $his virginity//<</if>> -<</if>> -<<if ($activeSlave.fetish != "masochist") || ($activeSlave.fetishKnown != 1) || ($activeSlave.fetishStrength <= 95)>> - <br> <<link "while in pain">> - <<replace "#result">> - You tell $him that $he deserves a way to get off for coming to tell you rather than breaking the rules. For the rest of the week, $he can come to you and masturbate: but you will abuse $him while $he does. $He starts to cry in fear, but <<if $activeSlave.belly >= 10000>>struggles to get<<else>>hurriedly gets<</if>> up on your desk anyway. You swat $his thighs apart so $he can get a hand down there. $He hesitates desperately before touching $himself, knowing that as soon as $he does the pain will start, but $his horniness wins out. You aim a vicious flick at $his <<if ($activeSlave.nipples == "huge")>>absurd nipples<<elseif ($activeSlave.nipples != "tiny")>>big nipples<<else>>nipples<</if>> and then take a crop out of your desk, flogging $his <<if ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>>fake<<elseif ($activeSlave.boobs > 1000)>>jiggling<<else>>firm<</if>> breasts without mercy. $He finally orgasms and flees, falling over $his own feet in $his desperation; $his acceptance of sexual slavery @@.hotpink;has increased.@@ - <<set $activeSlave.devotion += 4>> - <<if ($activeSlave.fetish == "masochist") && ($activeSlave.fetishKnown == 1)>> - <<set $activeSlave.fetishStrength += 4>> - @@.lightcoral;$His enjoyment of pain has increased.@@ - <<elseif random(1,100) > 50>> - <<set $activeSlave.fetishStrength = 65, $activeSlave.fetish = "masochist", $activeSlave.fetishKnown = 1>> - Before $he realizes what's happening, @@.lightcoral;$he's getting aroused at the thought of $his <<= getWrittenTitle($activeSlave)>> beating $him.@@ - <</if>> - <</replace>> - <</link>> -<</if>> + <<else>> + @@.hotpink;$he gets down on $his knees and offers you $his sore butthole again.@@ + <</if>> + <<set $activeSlave.trust -= 4, $activeSlave.devotion += 5>> + <<= VCheck.Anal($activeSlave, 1)>> + <</replace>> + <</link>> + </span> + <</replace>> +<</link>> <<case "restricted profession">> @@ -5926,372 +4720,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</replace>> <</link>> -<<case "dickgirl PC">> - -<<link "Permit $him to serve you in a way $he'll be comfortable with">> - <<replace "#result">> - The poor $girl is having trouble with - <<if $activeSlave.attrXY <= 35>> - guys, so you decide to be kind to $him and play up your feminine side. You lift $his $activeSlave.skin chin with a soft touch, and kiss $him gently on the lips, pressing your breasts full against $his - <<if $activeSlave.boobs > 5000>> - titanic udders, which are squashed between you. - <<elseif $activeSlave.boobs > 1000>> - own lovely boobs. - <<else>> - chest. - <</if>> - You keep your hips cocked back and to the side, so that your rapidly stiffening dick stays clear of $him. Taking $his hands in your own, you guide them to your - <<if $PC.boobs >= 1400>> - enormous <<if $PC.boobsImplant != 0>>chest balloons<<else>>cow tits<</if>>. - <<elseif $PC.boobs >= 1200>> - huge<<if $PC.boobsImplant != 0>>, clearly fake<<else>>, heavy<</if>> breasts. - <<elseif $PC.boobs >= 1000>> - big<<if $PC.boobsImplant != 0>>, perky<</if>> breasts. - <<elseif $PC.boobs >= 800>> - generous breasts. - <<elseif $PC.boobs >= 650>> - handfilling breasts - <<elseif $PC.boobs >= 500>> - average breasts - <<elseif $PC.boobs >= 300>> - small breasts - <</if>> - <br><br> - $He hesitates, clearly surprised that you're allowing $him to fondle you, but building arousal is making $him forget $his awkwardness and $he begins to play with your boobs in earnest. You direct $his fingers to your nipples, and $he obeys the nonverbal cue, devoting more attention to the <<if $PC.lactation > 0>>milky<<else>>hard<</if>>, sensitive nubs. Satisfied that $he's got the idea, you run your hands lightly down $his - <<if $activeSlave.weight > 190>> - voluminous - <<elseif $activeSlave.belly >= 5000>> - <<if $activeSlave.bellyPreg >= 3000>> - gravid - <<elseif $activeSlave.bellyImplant >= 3000>> - rounded - <<else>> - swollen - <</if>> - <<elseif $activeSlave.weight > 30>> - soft - <<elseif $activeSlave.muscles > 30>> - rock hard - <<elseif $activeSlave.weight > 10>> - plush - <<elseif $activeSlave.muscles > 5>> - toned - <<else>> - soft - <</if>> - body and give $his - <<if $activeSlave.butt > 15>> - obscene - <<elseif $activeSlave.butt > 10>> - absurd - <<elseif $activeSlave.butt > 6>> - monstrous - <<elseif $activeSlave.butt > 3>> - healthy - <<else>> - cute - <</if>> - buttocks a gentle massage. - <br><br> - $He has $his eyes closed, and is spared any indication that $he's petting and being petted by a person with a cock. $His arousal builds quickly, and so does yours. You resolve the situation by using a hand on each of you: you finish yourself off with practiced ease while giving $his - <<if canDoVaginal($activeSlave)>> - clit - <<elseif canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - own erection - <<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - fat member - <<elseif $activeSlave.dick > 0 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - soft member - <<elseif ($activeSlave.chastityPenis == 1)>> - nipples - <<elseif ($activeSlave.chastityVagina)>> - nipples - <<else>> - soft perineum - <</if>> - some manual stimulation that tips $him over the edge. $He opens $his eyes slowly, @@.hotpink;grateful@@ that you were so merciful. - <<elseif $activeSlave.attrXX <= 35>> - girls, so you decide to be kind to $him and play up your masculine side. You grab the side of $his neck with a rough grip, and pull $him downward, forcing $him to $his knees. $He goes willingly, $his field of vision filling with your rapidly hardening member. - <<if ($activeSlave.teeth == "removable")>> - $He quickly pulls $his removable teeth out, getting ready to offer you $his soft facepussy. - <<elseif ($activeSlave.teeth == "pointy")>> - $He runs $his tongue over $his frightening teeth carefully, and then opens $his jaws wide, getting ready to keep $his fangs well clear of your shaft. - <<elseif ($activeSlave.teeth == "fangs")>> - $He runs $his tongue over $his fangs carefully, and then opens $his jaws wide, getting ready to keep $his teeth well clear of your shaft. - <<elseif ($activeSlave.teeth == "fang")>> - $He gets ready to take you from an angle to avoid $his fang meeting your member. - <<elseif ($activeSlave.teeth == "straightening braces") || ($activeSlave.teeth == "cosmetic braces")>> - $He runs $his tongue over $his braces, and then opens wide, mindful of keeping $his orthodontia clear of your shaft. - <<elseif ($activeSlave.teeth == "gapped")>> - $He runs $his tongue across the gap in $his front teeth and opens wide. - <</if>> - $He takes you into $his mouth without hesitation, and keeps $his eyes closed. $He visibly concentrates all $his attention on your dick, ignoring the breasts that are starting to bounce right over $his head as you begin rocking your hips with enjoyment. - <br><br> - You run a possessive hand through $his $activeSlave.hColor hair, and let $him know what a good little cocksucker $he is. $He moans submissively in response, and the humming feels so wonderful that you order $him to do it again. Knowing that you're being nice to $him by letting $his ignore your more feminine characteristics for the moment, $he does $his best to please you, humming as best $he can and using both hands to pleasure your base and balls. You blow your load down $his throat, and $he swallows it all. $He opens $his eyes slowly, @@.mediumaquamarine;relieved@@ that you were so merciful. - <</if>> - <<set $activeSlave.trust += 4>> - <<run seX($activeSlave, "oral", $PC, "penetrative")>> - <</replace>> -<</link>> -<br><<link "Force $him to get off to all of you">> - <<replace "#result">> - The closeminded $girl is having trouble with - <<if $activeSlave.attrXY <= 35>> - guys, so $he gets to spend some quality time with your dick. You walk into $him, running into the surprised slave, driving $him backward into the far wall. You kiss $him, pinch $him, and grope $him roughly the whole time, pressing your breasts maliciously against $his - <<if $activeSlave.boobs > 5000>> - titanic udders, which are squashed between you. - <<elseif $activeSlave.boobs > 1000>> - own lovely boobs. - <<else>> - chest. - <</if>> - When $his - <<if $activeSlave.butt > 15>> - obscene - <<elseif $activeSlave.butt > 10>> - absurd - <<elseif $activeSlave.butt > 6>> - monstrous - <<elseif $activeSlave.butt > 3>> - healthy - <<else>> - cute - <</if>> - buttocks crash against the wall, you smash yourself against $him. $He shudders involuntarily as $he feels your stiffening dick between you<<if $activeSlave.belly >= 5000>> and $his rounded stomach<</if>>, and then again as it rapidly achieves full hardness, crushed between your warm bodies. - <br><br> - Making out with $him so insistently that $he's short of breath, you begin to hump yourself against $him, sliding your prick against $his <<if $activeSlave.belly >= 5000>>_belly <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>><</if>><</if>>belly, thighs, and - <<if canDoVaginal($activeSlave)>> - labia. - <<elseif canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - own dick. - <<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - fat cock. - <<elseif $activeSlave.dick > 0 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - limp member. - <<elseif ($activeSlave.chastityPenis == 1)>> - caged dick. - <<elseif ($activeSlave.chastityVagina)>> - chastity belt. - <<else>> - soft perineum. - <</if>> - $He shudders uncomfortably as $he realizes that $he's getting aroused, $his - <<if $activeSlave.vagina > -1>> - pussy moistening - <<elseif canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - dick hardening - <<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - dick struggling to engorge - <<elseif $activeSlave.dick > 0 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - girldick starting to ooze precum - <<elseif ($activeSlave.chastityPenis == 1)>> - chastity cage growing ever tighter - <<else>> - tiny front hole starting to ooze precum - <</if>> - from the stimulation, despite $his lack of appetite for cock. - <<if !canDoAnal($activeSlave) && !canDoVaginal($activeSlave)>> - $He knows what's coming when you push $him - <<if $activeSlave.belly >= 300000>> - over $his _belly stomach, - <<else>> - to $his knees, - <</if>> - and does $his best to relax. - <br><br> - $He screws $his eyes shut tight and $his mouth tighter as you prod at $his face with your member. Tiring of $his reluctance, you give $him a brusque order to open $his eyes and gaze upon the dick $he will soon be deepthroating. $He obeys, but unwillingly, and steadies $himself to take its length. You tell $him to do $his best to watch, and begin thrusting. $He groans from the internal fullness and sexual confusion. $He stares as best $he can at your penis, transfixed by the sight of it thrusting into $his mouth and the feeling of $his lips around its girth. - <br><br> - $He slips a hand to $his crotch, $his arousal overwhelming $his preferences. $He whimpers pathetically, seeing and feeling $himself build towards an inevitable orgasm. You manage $him skillfully, holding back to $his point of climax before shooting your cum deep inside $him. The internal sensation of heat, the tightening and twitching of your member inside $his mouth, and your obvious pleasure force $him over the edge, and $he comes so hard that $he chokes on your cock. You pull out of $him, and $he struggles to catch $his breath, the action sending a blob of $his owner's semen running down $his chin. - <<run seX($activeSlave, "oral", $PC, "penetrative", 7)>> - <<elseif $activeSlave.belly >= 10000>> - $He knows what's coming when you push $him - <<if $activeSlave.belly >= 300000>> - over $his _belly stomach, - <<else>> - to $his knees, - <</if>> - and does $his best to relax. - <br><br> - $He screws $his eyes shut tight as you maneuver yourself inside $his - <<if canDoVaginal($activeSlave)>> - <<if $activeSlave.vagina > 2>> - cavernous cunt. - <<elseif $activeSlave.vagina > 1>> - welcoming pussy. - <<else>> - tight flower. - <</if>> - <<else>> - <<if $activeSlave.anus > 2>> - unresisting asspussy. - <<elseif $activeSlave.anus > 1>> - welcoming butthole. - <<else>> - tight anus. - <</if>> - <</if>> - Once you're situated, you give $him a brusque order to open $his eyes and look behind $him. $He obeys, but unwillingly, bending as best $he can to see how physically close you are. $He can't see where it enters $his - <<if canDoVaginal($activeSlave)>> - womanhood, - <<else>> - bowels, - <</if>> - but $he's very aware of it. You tell $him to do $his best to watch, and begin thrusting. $He groans from the awkward position, internal fullness, and sexual confusion. Turned as much as $he can, $he stares, transfixed by the sight of you thrusting into $his body. - <<if canDoVaginal($activeSlave)>> - <<= VCheck.Vaginal($activeSlave, 7)>> - <<else>> - <<= VCheck.Anal($activeSlave, 7)>> - <</if>> - <br><br> - You snake a hand under $him and begin to stimulate $him manually. $He whimpers pathetically, seeing and feeling $himself build towards an inevitable orgasm. You manage $him skillfully, bringing $him to the point of climax before shooting your cum deep inside $him. The internal sensation of heat, the tightening and twitching of your member inside $him, and your obvious pleasure force $him over the edge, and $he comes so hard that $he wriggles involuntarily against you. You release $him, and $he barely manages to catch $himself from collapsing, the motion sending a blob of $his owner's semen running down $his thigh. - <<else>> - $He knows what's coming when you pin $his torso even harder and reach down to pull $his knees up to clasp you around your waist, and does $his best to relax. - <br><br> - $He screws $his eyes shut tight as you maneuver yourself inside $his - <<if canDoVaginal($activeSlave)>> - <<if $activeSlave.vagina > 2>> - cavernous cunt. - <<elseif $activeSlave.vagina > 1>> - welcoming pussy. - <<else>> - tight flower. - <</if>> - <<else>> - <<if $activeSlave.anus > 2>> - unresisting asspussy. - <<elseif $activeSlave.anus > 1>> - welcoming butthole. - <<else>> - tight anus. - <</if>> - <</if>> - Once you're confident your member is properly seated inside $him, and you won't drop $him, you give $him a brusque order to open $his eyes and look down. $He obeys, but unwillingly, bending as best $he can to look at the base of your dick where it - <<if canDoVaginal($activeSlave)>> - enters $his womanhood. - <<else>> - disappears beneath - <<if canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - $his own erect cock. - <<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - $his own dangling cock. - <<elseif ($activeSlave.chastityPenis == 1)>> - $his chastity. - <<else>> - $him. $He can't see where it enters $his bowels, but $he's very aware of it. - <</if>> - <</if>> - You tell $him to do $his best to watch, and begin thrusting. $He groans from the awkward position, internal fullness, and sexual confusion. Bent almost in half, $he stares, transfixed by the sight of your penis delving inside $his body. - <<if canDoVaginal($activeSlave)>> - <<= VCheck.Vaginal($activeSlave, 7)>> - <<else>> - <<= VCheck.Anal($activeSlave, 7)>> - <</if>> - <br><br> - You push a hand between the two of you and begin to stimulate $him manually. $He whimpers pathetically, seeing and feeling $himself build towards an inevitable orgasm. You manage $him skillfully, bringing $him to the point of climax before shooting your cum deep inside $him. The internal sensation of heat, the tightening and twitching of your member inside $him, and your obvious pleasure force $him over the edge, and $he comes so hard that $he wriggles involuntarily within your grasp. You drop $him, and $he barely manages to catch $himself on shaking legs, the motion sending a blob of $his owner's semen running down $his thigh. - <</if>> - <br><br> - Over the week, you force $him to achieve daily orgasm as your cock pounds in and out of $him. It's difficult, blowing your load inside a compliant slave $girl every day, but you make the necessary sacrifice. - <<if random(1,2) == 1>> - After a few days, $he's @@.green;obviously reconsidering $his previous hesitations about dick.@@ - <<set $activeSlave.attrXY += 5>> - <<else>> - $He takes it like a good slave. $His dislike for dick doesn't change, but $he gets better at @@.hotpink;suppressing $his own inclinations@@ and serving as your cum receptacle. - <<set $activeSlave.devotion += 4>> - <</if>> - <<elseif $activeSlave.attrXX <= 35>> - girls, so $he gets to spend some quality time with your feminine side. You kiss $him, teasing your tongue against $him, and press your breasts maliciously against $his - <<if $activeSlave.boobs > 5000>> - titanic udders, which are squashed between you. - <<elseif $activeSlave.boobs > 1000>> - own lovely boobs. - <<else>> - chest. - <</if>> - $He shrinks away from you involuntarily, but you stroke loving hands down $his temples, the sides of $his neck, and $his upper arms. $He shudders involuntarily, and you can almost feel $him hate $himself through your lip lock. You cock your hips back and to the side, keeping your prick well clear of $him. As far as $he can feel, you're all boobs and feminine lips. - <br><br> - <<if $activeSlave.toyHole == "dick" || ($policies.sexualOpenness == 1 && canPenetrate($activeSlave))>> - You walk forward, pressing $him against the far wall, and then turn yourself around, pinning $him against the wall with your butt<<if $activeSlave.belly >= 5000>>, working your way under $his _belly belly<</if>>. As $he hesitates, wondering what to do about this, you grab $his hands and place them on your - <<if $PC.butt >= 5>> - enormous, <<if $PC.buttImplant != 0>>beachball cheeks<<else>>wobbling ass<</if>>, - <<elseif $PC.butt >= 4>> - huge, <<if $PC.buttImplant != 0>>balloon of an<<else>>soft<</if>> ass, - <<elseif $PC.butt >= 3>> - big<<if $PC.buttImplant != 0>> fake<</if>> ass, - <<else>> - ass, - <</if>> - leading $him like a music teacher guiding a student's hands. When $he's groping your buttocks properly, you grind against $him for a while, grinning to yourself as you feel an unwilling erection building between your cheeks. Pleased, you lean forward and line up your <<if $PC.vagina != -1>>pussy<<else>>asshole<</if>> with $his dick head and push back into $him. You repeat until $his hips start moving on their own. You bite on your finger at the sensation of $his cock inside you and, using your other hand, begin to jerk yourself off. Except for your vigorous stroking with one hand, there's little to indicate to $him that you have a dick; it must feel as though $he is banging a beautiful woman. $He whimpers pathetically, seeing and feeling $himself build towards an inevitable orgasm. You manage $him skillfully, taking $him to the point of climax before enjoying your own orgasm. The heat of your insides, the tightening and twitching of your <<if $PC.vagina != -1>>vagina<<else>>rectum<</if>> around $his cock, and your obvious pleasure force $him over the edge, and $he comes so hard that $he nearly knocks your to the floor. You scoot forward, letting $him slip from you. $He gets a splendid sight of your still gaped <<if $PC.vagina != -1>>cunt<<else>>anus<</if>> begging for more<<if $activeSlave.balls > 0>> as a blob of $his semen drips from your body<</if>>. - <br><br> - Over the week, you require $him to repeat this sexually confusing performance daily. It's difficult, having to savor a compliant slave's penis every day, but you make the necessary sacrifice. - <<if canImpreg($PC, $activeSlave)>> - <<= knockMeUp($PC, 40, 0, $activeSlave.ID)>> - <</if>> - <<elseif $activeSlave.belly >= 150000>> - You walk forward, pressing $him against the far wall, and then turn yourself around, pinning $him against the wall with your butt, working your way under $his _belly belly. As $he hesitates, wondering what to do about this, you grab $his hands and place them on your - <<if $PC.butt >= 5>> - enormous, <<if $PC.buttImplant != 0>>beachball cheeks<<else>>wobbling ass<</if>>, - <<elseif $PC.butt >= 4>> - huge, <<if $PC.buttImplant != 0>>balloon of an<<else>>soft<</if>> ass, - <<elseif $PC.butt >= 3>> - big<<if $PC.buttImplant != 0>> fake<</if>> ass, - <<else>> - ass, - <</if>> - leading $him like a music teacher guiding a student's hands. When $he's groping your buttocks properly, you grind against $him for a while, grinning to yourself as you feel - <<if canDoVaginal($activeSlave)>> - an unwilling heat building low behind you. Pleased, you lean back and start to play with $his clit, using your other hand to jerk off. - <<elseif canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - an unwilling erection building between your cheeks. Pleased, you lean back and start to play with $his dick, using your other hand to jerk yourself off. - <<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - the huge cock behind you start to leak onto your back. Pleased, you lean back and start to play with $his dick, using your other hand to jerk yourself off. - <<elseif $activeSlave.dick > 0 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - the pretty girldick behind you start to leak. Pleased, you lean back and start to play with $his soft bitchclit, using your other hand to jerk yourself off. - <<elseif ($activeSlave.chastityPenis == 1)>> - an unwilling heat building low behind you. Pleased, you lean back and start to tease $his chastity cage, using your other hand to jerk off. - <<elseif ($activeSlave.chastityVagina)>> - an unwilling heat building low behind you. Pleased, you lean back and start to tease $his chastity, using your other hand to jerk off. - <<elseif ($activeSlave.race == "catgirl")>> - a demure heat building behind you. Pleased, you lean back and start to play with the soft silky fur between $his legs. - <<else>> - a demure heat building behind you. Pleased, you lean back and start to play with the soft smooth skin between $his legs. - <</if>> - Except for your vigorous stroking with one hand, there's little to indicate to $him that you have a dick. It must feel as though $he has a beautiful woman under $his middle, and is playing with $his ass while $he gets $him off manually. You complete the feeling by bucking against $him with extra enthusiasm when you climax. - <br><br> - Over the week, you require $him to repeat this sexually confusing performance daily. It's difficult, having to grind against a compliant slave every day, but you make the necessary sacrifice. - <<else>> - You walk forward, pressing $him against the far wall, and then turn yourself around, pinning $him against the wall with your butt<<if $activeSlave.belly >= 10000>> as well as you can with $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>> pushing into you<</if>>. As $he hesitates, wondering what to do about this, you grab $his hands and place them on your tits, leading $him like a music teacher guiding a student's hands. When $he's stroking your nipples properly, you grind against $him for a while, grinning to yourself as you feel - <<if canDoVaginal($activeSlave)>> - an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to play with $his clit, using your other hand to jerk off. - <<elseif canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - an unwilling erection building behind you. Pleased, you snake a hand around behind yourself and start to play with $his dick, using your other hand to jerk yourself off. - <<elseif $activeSlave.dick > 6 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - the huge cock behind you start to leak. Pleased, you snake a hand around behind yourself and start to play with $his dick, using your other hand to jerk yourself off. - <<elseif $activeSlave.dick > 0 && !canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - the pretty girldick behind you start to leak. Pleased, you snake a hand around behind yourself and start to play with $his soft bitchclit, using your other hand to jerk yourself off. - <<elseif ($activeSlave.chastityPenis == 1)>> - an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease $his chastity cage, using your other hand to jerk off. - <<elseif ($activeSlave.chastityVagina)>> - an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease $his chastity, using your other hand to jerk off. - <<elseif ($activeSlave.race == "catgirl")>> - a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft silky fur between $his legs. - <<else>> - a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft smooth skin between $his legs. - <</if>> - Except for your vigorous stroking with one hand, there's little to indicate to $him that you have a dick. It must feel as though $he has a beautiful woman in $his arm<<if hasBothArms($activeSlave)>>s<</if>>, and is playing with $his boobs while $he gets $him off manually. You complete the feeling by craning around to rain nibbles and kisses on $his $activeSlave.faceShape face. - <br><br> - Over the week, you require $him to repeat this sexually confusing performance daily. It's difficult, having one of your slaves detailed to stimulate your nipples every day, but you make the necessary sacrifice. - <</if>> - <<if random(1,2) == 1>> - After a few days, $he's @@.green;obviously reconsidering $his previous hesitations about tits and ass.@@ - <<set $activeSlave.attrXX += 5>> - <<else>> - $He serves your feminine body like a good slave. $His dislike for sex with girls doesn't change, but $he gets better at @@.hotpink;suppressing $his own inclinations@@ and serving as your plaything. - <<set $activeSlave.devotion += 4>> - <</if>> - <</if>> - <</replace>> -<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0) && $activeSlave.attrXY <= 35>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && canDoAnal($activeSlave) && ($activeSlave.anus == 0) && $activeSlave.attrXY <= 35>> //This option will take $his anal virginity//<</if>> - <<case "resistant anal virgin">> <<link "Let $him earn continued anal virginity">> @@ -7441,208 +5869,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. $His @@.hotpink;devotion to you@@ and @@.mediumaquamarine;trust in you@@ have increased. <</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>> -<<case "sleeping ambivalent">> - -<<link "Grope $his boob">> - <<replace "#result">> - $His eyes fly open as $he feels someone groping $him. - <<if ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>> - You're mauling $his fake boob, squeezing it and making the skin of $his breast, which is already stretched rather taut by the implant, stretch a bit farther. - <<elseif $activeSlave.boobs > 3000>> - You're hefting and massaging $his mass of breastflesh, playing with $his <<if ($activeSlave.boobsImplant/$activeSlave.boobs) < .60>>mostly <</if>>natural boob, making $his huge soft udder bounce and jiggle. - <<elseif $activeSlave.lactation > 0>> - You're kneading and massaging $his udder, and the milk begins to <<if $activeSlave.nipples != "fuckable">>bead at<<else>>leak from<</if>> the cow's nipple. - <<elseif $activeSlave.boobs > 300>> - You've got $his whole tit in your hands, jiggling and squeezing the entire thing. - <<else>> - You're massaging and squeezing $his flat chest. - <</if>> - $His face contorts with surprise and then outrage, but then $he <<if !canSee($activeSlave)>>recognizes your familiar <<if canSmell($activeSlave)>>smell<<else>>touch<</if>> and <</if>>realizes whose hand it is that's taking liberties with $him. - <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>> - Though $he's smart, - <<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>> - Though $he's not dumb, - <<else>> - $He's an idiot, and - <</if>> - in $his drowsy state $he can't figure out what to do. $He settles for @@.hotpink;freezing submissively@@ and letting you do what you like. You test $his compliance by - <<switch $activeSlave.nipples>> - <<case "inverted">> - painfully protruding $his fully inverted nipple. $He puts up with even that, though $he cries a little as it pops out. - <<case "partially inverted">> - painfully protruding $his partially inverted nipple. $He puts up with that, too, though $he winces as it pops out. - <<case "huge">> - rolling $his huge nipple between a thumb and forefinger, hard enough to hurt. $He accepts the mammary abuse. - <<case "fuckable">> - forcing your entire fist into $his nipple. $He accepts the stimulation as best $he can. - <<default>> - playing with $his nipple, pinching it hard enough to hurt. $He accepts the mammary abuse. - <</switch>> - Satisfied, you leave $him to get back to sleep as best $he can. - <<set $activeSlave.devotion += 4>> - <<if $activeSlave.lactation > 0>> - <<set $activeSlave.lactationDuration = 2>> - <<set $activeSlave.boobs -= $activeSlave.boobsMilk, $activeSlave.boobsMilk = 0>> - <</if>> - <</replace>> -<</link>> -<<if $activeSlave.belly >= 5000 || $activeSlave.weight > 30>> - <br><<link "Rub $his belly">> - <<replace "#result">> - <<if $activeSlave.bellyPreg >= 5000>> - $His eyes fly open as soon as $he feels someone touching $his _belly, life-rounded, stomach. - <<if $activeSlave.weight > 10>> - You're massaging and teasing $his huge, soft belly. - <<elseif $activeSlave.muscles > 5>> - You're massaging and teasing $his taut belly and ruined abs. - <<else>> - You're massaging and teasing $his taut belly. - <</if>> - $His face contorts with surprise and then outrage, but then $he <<if !canSee($activeSlave)>>recognizes your familiar <<if canSmell($activeSlave)>>smell<<else>>touch<</if>> and <</if>>realizes whose hand it is that's taking liberties with $him. - <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>> - Though $he's smart, - <<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>> - Though $he's not dumb, - <<else>> - $He's an idiot, and - <</if>> - in $his drowsy state $he can't figure out what to do. $He settles for @@.hotpink;freezing submissively@@ and letting you do what you like. You test $his compliance by - <<if $activeSlave.weight > 10>> - sinking your hands into $his fat to get a good feel of the life growing within. - <<else>> - feeling for the life growing within $him. - <</if>> - <<if $activeSlave.weight > 30>> - Though it takes some groping before you are met with a kick from $his unborn child. - <<elseif $activeSlave.pregType < 3>> - It doesn't take long before you are met with a kick from $his unborn child. - <<else>> - $He is so full of children that your ministrations are met with a hail of motion. - <</if>> - <<if $activeSlave.pregSource == -1>>Smiling at how active your children are<<else>>Satisfied<</if>>, - <<elseif $activeSlave.bellyImplant >= 5000>> - $His eyes fly open as soon as $he feels someone touching $his _belly stomach. - <<if $activeSlave.weight > 10>> - You're massaging and teasing $his huge, soft belly. - <<elseif $activeSlave.muscles > 5>> - You're massaging and teasing $his taut belly and ruined abs. - <<else>> - You're massaging and teasing $his taut belly. - <</if>> - $His face contorts with surprise and then outrage, but then $he <<if !canSee($activeSlave)>>recognizes your familiar <<if canSmell($activeSlave)>>smell<<else>>touch<</if>> and <</if>>realizes whose hand it is that's taking liberties with $him. - <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>> - Though $he's smart, - <<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>> - Though $he's not dumb, - <<else>> - $He's an idiot, and - <</if>> - in $his drowsy state $he can't figure out what to do. $He settles for @@.hotpink;freezing submissively@@ and letting you do what you like. You test $his compliance by - <<if $activeSlave.weight > 10>> - sinking your hands into $his fat to get a good feel of the implant hidden within. - <<else>> - feeling up the implant within $him. - <</if>> - <<if $activeSlave.weight > 30>> - Though it takes some groping before you locate the firm sphere. - <<elseif $activeSlave.belly < 10000>> - It doesn't take long for you to have a solid grip on the firm sphere. - <<else>> - It's so huge it's hard to miss, but that just gives you more room to poke and prod at. - <</if>> - Satisfied, - <<elseif $activeSlave.bellyFluid >= 5000>> - $His eyes fly open as soon as $he feels someone touching $his _belly, <<print $activeSlave.inflationType>>-filled stomach. - <<if $activeSlave.weight > 10>> - You're massaging and jiggling $his huge, soft belly, enjoying the sounds it makes as you move it. - <<elseif $activeSlave.muscles > 5>> - You're massaging and jiggling $his taut belly and stretched abs, enjoying the sounds it makes as you move it. - <<else>> - You're massaging and jiggling $his taut belly, enjoying the sounds it makes as you move it. - <</if>> - $His face contorts with surprise and then outrage, but then $he <<if !canSee($activeSlave)>>recognizes your familiar <<if canSmell($activeSlave)>>smell<<else>>touch<</if>> and <</if>>realizes whose hand it is that's taking liberties with $him. - <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>> - Though $he's smart, - <<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>> - Though $he's not dumb, - <<else>> - $He's an idiot, and - <</if>> - in $his drowsy state $he can't figure out what to do. $He settles for @@.hotpink;freezing submissively@@ and letting you do what you like. You test $his compliance by - <<if $activeSlave.weight > 10>> - sinking your hands into $his fat to get a good grip - <<else>> - wrapping your hands around the sloshing globe - <</if>> - and vigorously shaking. As $his gut's groaning from the sudden shift of its contents dies down, you gently apply pressure to the bloated organ, careful to only cause $his discomfort and not to disgorge $his contents. Satisfied, - <<else>> - $His eyes fly open as soon as $he feels someone touching $his - <<if $activeSlave.weight > 190>> - expansive belly. You're massaging and jiggling $his obscene gut while teasing $his many folds and struggling to find $his belly button. - <<elseif $activeSlave.weight > 160>> - massive, soft belly. You're massaging and jiggling $his obscene gut while teasing $his many folds and hidden belly button. - <<elseif $activeSlave.weight > 130>> - huge, soft belly. You're massaging and jiggling $his thick gut while teasing $his folds and hidden belly button. - <<elseif $activeSlave.weight > 95>> - big soft belly. You're massaging and jiggling $his gut while teasing $his folds and hidden belly button. - <<else>> - chubby middle. You're massaging and jiggling $his tiny gut. - <</if>> - $His face contorts with surprise and then outrage, but then $he <<if !canSee($activeSlave)>>recognizes your familiar <<if canSmell($activeSlave)>>smell<<else>>touch<</if>> and <</if>>realizes whose hand it is that's taking liberties with $him. - <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>> - Though $he's smart, - <<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>> - Though $he's not dumb, - <<else>> - $He's an idiot, and - <</if>> - in $his drowsy state $he can't figure out what to do. $He settles for @@.hotpink;freezing submissively@@ and letting you do what you like. You test $his compliance by roughly kneading $his pliant flesh, testing how well it can be molded into pleasurable valleys and ravines. Satisfied, - <</if>> - you leave $him to get back to sleep as best $he can. - <<set $activeSlave.devotion += 4>> - <</replace>> - <</link>> -<</if>> -<<if $PC.dick != 0>> - <br><<link "Cum on $his face">> - <<replace "#result">> - You stand over $him, quietly masturbating while watching $him sleep. Several of $his fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You fancy yourself a bit of a marks<<= _womanP>>, and you don't feel the need to bend over $him to score good hits. Your load comes in three main jets: the first hits $him on the nipple, the second tracks up $his sternum and throat, and the third splashes full across $his face as $his eyes fly open<<if $PC.vagina != -1>>, each of these accompanied by some less directionally perfect girlcum<</if>>. $He sputters with surprise and then outrage, but <<if !canSee($activeSlave)>>once $he recognizes your <<if canTaste($activeSlave)>>taste<<else>>presence<</if>> and<<else>>then $he<</if>> realizes who it is standing over $him <<if canSee($activeSlave)>>and<<else>>does $he<</if>> @@.gold;freezes in terror.@@ - <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>> - $He's quick, and $he immediately realizes - <<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>> - $He's not dumb, and $he quickly realizes - <<else>> - $He gradually manages to calculate - <</if>> - that doing anything other than thanking you would be phenomenally stupid. "Thank you, <<Master>>," $he <<if SlaveStatsChecker.checkForLisp($activeSlave)>>lisps<<else>>mumbles<</if>> blearily. You leave $him to @@.hotpink;puzzle over $his own submissiveness,@@ covered in your cum. - <<set $activeSlave.devotion += 4, $activeSlave.trust -= 2>> - <</replace>> - <</link>> -<<else>> - <br><<link "Squirt on $his face">> - <<replace "#result">> - You stand over $him, quietly masturbating while watching $him sleep. Several of $his fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You're on excellent terms with your cunt, and you know just what it takes to make yourself squirt. When you feel the heat building just right, you quickly straddle $his face without touching $him, angling yourself carefully and increasing the pace of your schlicking. In no time at all, a jet of femcum splashes onto $his face and down across $his chest. $He sputters with surprise and then outrage, but then $he <<if canSee($activeSlave)>>realizes whose pussy $he's staring straight into<<else>>recognizes your <<if canTaste($activeSlave)>>flavor<<else>>presence<</if>><</if>> and @@.gold;freezes in terror.@@ - <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>> - $He's quick, and $he immediately realizes - <<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -15>> - $He's not dumb, and $he quickly realizes - <<else>> - $He gradually manages to calculate - <</if>> - that doing anything other than thanking you would be phenomenally stupid. "Thank you, <<Master>>," $he <<if SlaveStatsChecker.checkForLisp($activeSlave)>>lisps<<else>>mumbles<</if>> blearily. You leave $him to @@.hotpink;puzzle over $his own submissiveness,@@ covered in your pussyjuice. - <<set $activeSlave.devotion += 4, $activeSlave.trust -= 2>> - <</replace>> - <</link>> -<</if>> -<br><<link "Just watch $him for a little while">> - <<replace "#result">> - You stand there for a while, watching the exhausted slave sleep. It's an oddly restful sight, and the aesthetics of $his slumbering little movements hold your attention for a time.<<if $activeSlave.preg > $activeSlave.pregData.normalBirth/2>> You watch the subtle movements going on within $his womb as well.<</if>> After a while, you head to your own bed. Several of $his fellow slaves came and went as you watched $him, but if they're surprised by the sight, they have the presence of mind not to show it. - <br><br> - One of them quietly lets $him know about the incident the next day, though, and the overall impact on $his mental state is surprisingly positive. In a more normal human setting, the news that someone watched $him sleep last night without $his consent or even knowledge at the time would disturb $him greatly. However, it's not uncommon for slaves in the dormitory to wake up to the sounds of the occupant of the bedroll next to theirs getting fucked, and without any consent, either. Perhaps you're odd, $he's obviously thinking, but @@.mediumaquamarine;perhaps you won't rape $him while $he sleeps.@@ - <<set $activeSlave.trust += 4>> - <</replace>> -<</link>> - <<case "sexy succubus">> <<link "Let $him eat">> @@ -8222,63 +6448,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</replace>> <</link>> -<<case "bad dream">> - -/* TODO: add a positive variant */ - -<<link "Let $him be">> - <<replace "#result">> - It may be for the best to not disturb $his unpeaceful slumber, you decide. Admiring the attractive view for just a moment longer, you turn back and head to your own bed. The next morning, it appears as though $activeSlave.slaveName doesn't even remember this nightmare. - <</replace>> -<</link>> -<br><<link "Hug $him">> - <<replace "#result">> - You reach out to hug $him, but as soon as your hand touches $his shoulder, $he writhes instinctively away. <<if canSee($activeSlave)>>$His eyes fly open, searching frantically for $his assailant. Seeing that it's you, $he screams and scrabbles away even harder. After making it a few feet, $he collects $his wits enough to bring $himself to a stop and stop screaming, though $he continues to sob, staring at you in terror<<else>>$He gropes frantically for $his assailant, before making contact with you. $He screams and scrabbles away, only stopping when $he collides with the nearest solid object. <<if canHear($activeSlave)>>Only after several call outs that it is you does $he stop screaming, though $he continues to sob, listening to your every breath in terror<<else>>After screaming $himself hoarse, $he realizes that $his assault has abruptly ended, and gently feels around $his surroundings with a shaking hand to discover $himself back in $his room<</if>><</if>>. $He remains frozen in place as you slowly advance on $him and give $him a light embrace. $His tears gradually stop, but $he does not relax, <<if canSee($activeSlave)>>remaining dumbly stiff<<else>>continuing to quake in fear<</if>> within your arms. Eventually you let $him go, and $he crawls pathetically back under $his sheet, still weeping softly. It seems $he is @@.gold;more afraid of you@@ than ever, and if you thought that a simple hug could win $him over, you were wrong. - <<if canSee($activeSlave)>> - <<set $activeSlave.trust -= 4>> - <<elseif canHear($activeSlave)>> - <<set $activeSlave.trust -= 5>> - <<else>> - <<set $activeSlave.trust -= 6>> - <</if>> - <</replace>> -<</link>> -<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>> - <br><<link "Rape $him">> - <<replace "#result">> - You snatch the sheet off $him, shove $his uppermost shoulder down so $his face is smashed into the pillow, and bring your knees down between $his legs, spreading them to force $hers apart. You use the hand that isn't controlling $his torso to locate $his - <<if canDoVaginal($activeSlave)>> - <<if $activeSlave.vagina > 2>> - amusingly loose cunt - <<elseif $activeSlave.vagina > 1>> - large womanhood - <<elseif $activeSlave.vagina > 0>> - tight pussy - <<else>> - poor virgin pussy - <</if>> - <<else>> - <<if $activeSlave.anus > 2>> - amusingly broad asshole - <<elseif $activeSlave.anus > 1>> - big butthole - <<elseif $activeSlave.anus > 0>> - tight rosebud - <<else>> - poor virgin anus - <</if>> - <</if>> - in the dark as $he begins to @@.gold;struggle and scream.@@ $He comes fully awake when $he feels your rough fingers searching for and then finding $his - <<if ($activeSlave.vagina >= 0) && canDoVaginal($activeSlave)>>vagina<<else>>crinkled hole<</if>>, and $his noise increases to the point where it becomes annoying. You stuff $his face into the pillow and take $him mercilessly, using the pillow to cut off $his breath whenever $he struggles too much, until oncoming suffocation forces $him to go still and take it like a good little bitch. - <br><br> - @@.mediumorchid;Sometimes dreams do come true.@@ - <br><br> - <<= VCheck.Simple($activeSlave, 1)>> - <<set $activeSlave.trust -= 4, $activeSlave.devotion -= 4>> - <</replace>> - <</link>><<if (($activeSlave.vagina == 0) && canDoVaginal($activeSlave)) || (($activeSlave.anus == 0) && canDoAnal($activeSlave))>> //This option will take $his virginity//<</if>> -<</if>> - <<case "shower slip">> <<link "Carry $him to where $he needs to go">>