diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index 9bf0d97bc527389ddb5eae8f65edc2fe5c79d3ab..df5e20795791d5fbc3be387a182de46d994860da 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -15,7 +15,6 @@ App.Data.defaultGameStateVariables = { /** @type {Object.<number, number>} */ slaveIndices: {}, genePool: [], - geneMods: {NCS: 0, rapidCellGrowth: 0}, missingTable: {}, /** @type {App.Entity.SlaveState[]} */ slaves: [], diff --git a/src/Corporation/corporate-divisionBase.js b/src/Corporation/corporate-divisionBase.js index 9239a9a4297959f00236e7d3d881a1aa4c393a81..de161794bec99286320e9b4d6431206666b068de 100644 --- a/src/Corporation/corporate-divisionBase.js +++ b/src/Corporation/corporate-divisionBase.js @@ -41,7 +41,7 @@ App.Corporate.Init_DivisionBase = function(shared) { set developmentCount(value) { if(value < 0) { throw "Cannot set development count to less than 0"; } // dissolve is the only function that sets founded to false. - if(value == 0 && this.founded) { throw "Cannot set development count to 0; use dissolve instead."; } + if(value === 0 && this.founded) { throw "Cannot set development count to 0; use dissolve instead."; } this.setStored("Dev", value); } @@ -150,13 +150,12 @@ App.Corporate.Init_DivisionBase = function(shared) { // Unless otherwise specified, divisions don't produce revenue directly. } endWeek_Transfer(divLedger) { - let transferRetval = {total:0}; let divisions = []; for(let otherDiv of this.relatedDivisions.to.filter(div=> div.founded && this.getAutoSendToDivision(div))) { const otherLedger = divLedger.weekLedger.getDivision(otherDiv); const room = otherDiv.availableRoom - otherLedger.transfer.in; - if(room == 0) { continue; } + if(room === 0) { continue; } divisions.push({division: otherDiv, room}); } const fillDivisions = evenFillArray(divisions, this.heldSlaves, pair=>pair.room); diff --git a/src/Corporation/corporate.js b/src/Corporation/corporate.js index 9c35f74a7003e7431e0457ce7ea8c97819cc0c12..d2d6a93ba1ae688b4cc561d6ce9494c76a0ffaf8 100644 --- a/src/Corporation/corporate.js +++ b/src/Corporation/corporate.js @@ -264,7 +264,7 @@ App.Corporate.Init = function() { super(); this._const.category = App.Corporate.maintenance.divisionCategories[categoryId]; - if(this._const.category == null) { throw new "Invalid category id: " + categoryId; } + if(this._const.category == null) { throw "Invalid category id: " + categoryId; } this._var.divisions = []; } addDivision(division) { @@ -397,7 +397,7 @@ App.Corporate.Init = function() { SellUnhousedSlaves: function(division, divLedger, rate) { if(divLedger.market.sell != 0) { return; } - let housing = 2 * rate * division.developmentCount; + let housing = Math.trunc(2 * rate * division.developmentCount); let unhoused = division.heldSlaves - housing; if(unhoused <= 0) { return; } diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js index ed44cd202d2b3a2958464e9a90de42a2329437a3..07ce59668170cc28bba63d831fd0205b8b05a2d1 100644 --- a/src/data/backwardsCompatibility/backwardsCompatibility.js +++ b/src/data/backwardsCompatibility/backwardsCompatibility.js @@ -1252,8 +1252,11 @@ App.Update.slaveRecords = function(node) { nurseryDiv.append(`Checking and fixing records for nursery cribs... `); V.cribs.forEach((child) => { if (child.actualAge < 3) { - // infants are not slaves, they need their own update code (but there isn't any yet) + // infants are not slaves, they need their own update code (but there isn't much yet) // note that some infants have been *converted into* corrupted slaves by bad old BCs...no attempt is made to fix them here + if (child.spermY === undefined) { + child.spermY = normalRandInt(50, 5); + } App.Facilities.Nursery.InfantDatatypeCleanup(child); } else { App.Update.Slave(child); @@ -2033,6 +2036,9 @@ App.Update.oldVersions = function(node) { V.PC.faceShape = "normal"; } } + if (typeof V.PC.spermY === "undefined") { + V.PC.spermY = 50; // exactly + } if ((typeof V.familyTesting === "undefined") && V.releaseID < 1065) { // possibly vanilla FC; compel V.familyTesting to 0 so that the family upgrade will run on slaves diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js index 90521b6347a804f8c63610710d6e836d934d1592..ce7c3899fabe8b1ad49dc3f5ed4c8c0cda68fc9d 100644 --- a/src/data/backwardsCompatibility/datatypeCleanup.js +++ b/src/data/backwardsCompatibility/datatypeCleanup.js @@ -1145,490 +1145,6 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() { } })(); -/* a lot of this may need to be removed */ -globalThis.ChildDatatypeCleanup = function(child) { - childAgeDatatypeCleanup(child); - childPhysicalDatatypeCleanup(child); - childFaceDatatypeCleanup(child); - childHairDatatypeCleanup(child); - childBoobsDatatypeCleanup(child); - childButtDatatypeCleanup(child); - childPregnancyDatatypeCleanup(child); - childBellyDatatypeCleanup(child); - childGenitaliaDatatypeCleanup(child); - childImplantsDatatypeCleanup(child); - childPiercingsDatatypeCleanup(child); - childTattooDatatypeCleanup(child); - childCosmeticsDatatypeCleanup(child); - childDietDatatypeCleanup(child); - childPornDatatypeCleanup(child); - childRelationDatatypeCleanup(child); - childSkillsDatatypeCleanup(child); - childStatCountDatatypeCleanup(child); - childPreferencesDatatypeCleanup(child); - childRulesDatatypeCleanup(child); - childCustomStatsDatatypeCleanup(child); - childMiscellaneousDatatypeCleanup(child); - generatePronouns(child); -}; - -globalThis.childAgeDatatypeCleanup = function(child) { - child.birthWeek = Math.clamp(+child.birthWeek, 0, 51) || 0; - if (child.age > 0) { - child.actualAge = Math.clamp(+child.actualAge, V.minimumChildAge, Infinity) || child.age; /* if undefined, this sets to child.age */ - delete child.age; - } else { - child.actualAge = Math.clamp(+child.actualAge, V.minimumChildAge, Infinity) || 18; - } - child.visualAge = Math.max(+child.visualAge, 0) || child.actualAge; - child.physicalAge = Math.max(+child.physicalAge, 0) || child.actualAge; - child.ovaryAge = Math.max(+child.ovaryAge, 0) || child.physicalAge; - child.pubertyAgeXX = Math.max(+child.pubertyAgeXX, 0) || V.fertilityAge; - child.pubertyAgeXY = Math.max(+child.pubertyAgeXY, 0) || V.potencyAge; -}; - -globalThis.childPhysicalDatatypeCleanup = function(child) { - if (typeof child.nationality !== "string") { - child.nationality = "child"; - } - if (typeof child.race !== "string") { - nationalityToRace(child); - } - if (typeof child.origRace !== "string") { - child.origRace = child.race; - } - if (typeof child.skin !== "string") { - child.skin = "light"; - } - if (typeof child.origSkin !== "string") { - child.origSkin = child.skin; - } - if (typeof child.minorInjury !== "string") { - child.minorInjury = 0; - } - if (typeof child.health === "number") { - const condition = child.health; - child.health = {}; - child.health.condition = condition; - } - child.health.condition = Math.clamp(child.health.condition, -100, 100) || 0; - child.health.shortDamage = Math.max(+child.health.shortDamage, 0) || 0; - child.health.longDamage = Math.max(+child.health.longDamage, 0) || 0; - child.health.illness = Math.max(+child.health.illness, 0) || 0; - child.health.tired = Math.clamp(+child.health.tired, 0, 100) || 0; - child.health.health = Math.clamp(child.health.condition - child.health.shortDamage - child.health.longDamage, -100, 100) || 0; - child.muscles = Math.clamp(+child.muscles, -100, 100) || 0; - child.weight = Math.clamp(+child.weight, -100, 200) || 0; - child.waist = Math.clamp(+child.waist, -100, 100) || 0; - child.height = Math.round(Math.max(+child.height, 0)) || Math.round(Height.mean(child)); - child.shoulders = Math.clamp(+child.shoulders, -2, 2) || 0; - child.hips = Math.clamp(+child.hips, -2, 3) || 0; -}; - -globalThis.childFaceDatatypeCleanup = function(child) { - child.face = Math.clamp(+child.face, -100, 100) || 0; - if (typeof child.faceShape !== "string") { - child.faceShape = "normal"; - } - if (child.lips !== 0) { - child.lips = Math.clamp(+child.lips, 0, 100) || 15; - } -}; - -globalThis.childHairDatatypeCleanup = function(child) { - if (typeof child.hColor !== "string") { - child.hColor = "brown"; - } - if (typeof child.origHColor !== "string") { - child.origHColor = child.hColor; - } - if (child.hLength !== 0) { - child.hLength = Math.clamp(+child.hLength, 0, 300) || 60; - } - if (typeof child.hStyle !== "string") { - child.hStyle = "long"; - } - child.haircuts = Math.clamp(+child.haircuts, 0, 1) || 0; - child.bald = Math.clamp(+child.bald, 0, 1) || 0; - if (typeof child.pubicHColor !== "string") { - child.pubicHColor = child.hColor; - } - if (typeof child.pubicHStyle !== "string") { - child.pubicHStyle = "neat"; - } - if (typeof child.underArmHColor !== "string") { - child.underArmHColor = child.hColor; - } - if (typeof child.underArmHStyle !== "string") { - child.underArmHStyle = "waxed"; - } - if (typeof child.eyebrowHColor !== "string") { - child.eyebrowHColor = child.hColor; - } - if (typeof child.eyebrowHStyle !== "string") { - child.eyebrowHStyle = "natural"; - } - if (typeof child.eyebrowFullness !== "string") { - child.eyebrowFullness = "natural"; - } -}; - -globalThis.childBoobsDatatypeCleanup = function(child) { - child.boobs = Math.max(+child.boobs, 100) || 200; - if (typeof child.boobShape !== "string") { - child.boobShape = "normal"; - } - if (typeof child.nipples !== "string") { - child.nipples = "cute"; - } - if (typeof child.nipplesAccessory !== "string") { - child.nipplesAccessory = "none"; - } - child.areolae = Math.clamp(+child.areolae, 0, 4) || 0; - if (typeof child.areolaeShape !== "string") { - child.areolaeShape = "circle"; - } - child.lactation = Math.clamp(+child.lactation, 0, 2) || 0; - child.lactationAdaptation = Math.clamp(+child.lactationAdaptation, 0, 100) || 0; -}; - -globalThis.childButtDatatypeCleanup = function(child) { - if (child.butt !== 0) { - child.butt = Math.clamp(+child.butt, 0, 20) || 1; - } - child.anus = Math.clamp(+child.anus, 0, 4) || 0; - child.analArea = Math.max(+child.analArea, 0) || 0; -}; - -globalThis.childPregnancyDatatypeCleanup = function(child) { - child.induce = Math.clamp(+child.induce, 0, 1) || 0; - child.labor = Math.clamp(+child.labor, 0, 1) || 0; - child.prematureBirth = Math.clamp(+child.prematureBirth, 0, 1) || 0; - child.ovaries = Math.clamp(+child.ovaries, 0, 1) || 0; - child.vasectomy = Math.clamp(+child.vasectomy, 0, 1) || 0; - child.mpreg = Math.clamp(+child.mpreg, 0, 1) || 0; - if (child.pregAdaptation !== 0) { - child.pregAdaptation = Math.max(+child.pregAdaptation, 0) || 50; - } - child.pregSource = +child.pregSource || 0; - if (typeof child.pregControl !== "string") { - child.pregControl = "none"; - } - child.fertPeak = Math.clamp(+child.fertPeak, 0, 4) || 0; - WombNormalizePreg(child); -}; - -globalThis.childBellyDatatypeCleanup = function(child) { - child.bellySag = Math.max(+child.bellySag, 0) || 0; - child.bellySagPreg = Math.max(+child.bellySagPreg, 0) || child.bellySag; - SetBellySize(child); -}; - -globalThis.childGenitaliaDatatypeCleanup = function(child) { - child.vagina = Math.clamp(+child.vagina, -1, 10) || 0; - child.vaginaLube = Math.clamp(+child.vaginaLube, 0, 2) || 0; - child.labia = Math.clamp(+child.labia, 0, 3) || 0; - child.clit = Math.clamp(+child.clit, 0, 5) || 0; - child.foreskin = Math.max(+child.foreskin, 0) || 0; - child.dick = Math.max(+child.dick, 0) || 0; - if (child.dick && child.prostate !== 0) { - child.prostate = Math.clamp(+child.prostate, 0, 3) || 1; - } else { - child.prostate = Math.clamp(+child.prostate, 0, 3) || 0; - } - child.balls = Math.max(+child.balls, 0) || 0; - if (child.scrotum !== 0) { - child.scrotum = Math.max(+child.scrotum, 0) || child.balls; - } -}; - -globalThis.childImplantsDatatypeCleanup = function(child) { - child.ageImplant = Math.clamp(+child.ageImplant, 0, 1) || 0; - child.faceImplant = Math.clamp(+child.faceImplant, 0, 100) || 0; - child.lipsImplant = Math.clamp(+child.lipsImplant, 0, 100) || 0; - child.voiceImplant = Math.clamp(+child.voiceImplant, -1, 1) || 0; - child.boobsImplant = Math.max(+child.boobsImplant, 0) || 0; - if (child.boobsImplant === 0) { - child.boobsImplantType = "none"; - } else if (child.boobsImplantType === "none") { - child.boobsImplantType = "normal"; - } - child.breastMesh = Math.clamp(+child.breastMesh, 0, 1) || 0; - child.buttImplant = Math.clamp(+child.buttImplant, 0, 3) || 0; - if (child.buttImplant === 0) { - child.buttImplantType = "none"; - } else if (child.buttImplantType === "none") { - child.buttImplantType = "normal"; - } - child.earImplant = Math.clamp(+child.earImplant, 0, 1) || 0; -}; - -globalThis.childPiercingsDatatypeCleanup = function(child) { - child.earPiercing = Math.clamp(+child.earPiercing, 0, 2) || 0; - child.nosePiercing = Math.clamp(+child.nosePiercing, 0, 2) || 0; - child.eyebrowPiercing = Math.clamp(+child.eyebrowPiercing, 0, 2) || 0; - child.lipsPiercing = Math.clamp(+child.lipsPiercing, 0, 2) || 0; - child.tonguePiercing = Math.clamp(+child.tonguePiercing, 0, 2) || 0; - child.nipplesPiercing = Math.clamp(+child.nipplesPiercing, 0, 2) || 0; - child.areolaePiercing = Math.clamp(+child.areolaePiercing, 0, 2) || 0; - child.corsetPiercing = Math.clamp(+child.corsetPiercing, 0, 1) || 0; - child.navelPiercing = Math.clamp(+child.navelPiercing, 0, 2) || 0; - child.clitPiercing = Math.clamp(+child.clitPiercing, 0, 3) || 0; - child.vaginaPiercing = Math.clamp(+child.vaginaPiercing, 0, 2) || 0; - child.dickPiercing = Math.clamp(+child.dickPiercing, 0, 2) || 0; - child.anusPiercing = Math.clamp(+child.anusPiercing, 0, 2) || 0; -}; - -globalThis.childTattooDatatypeCleanup = function(child) { - if (typeof child.shouldersTat !== "string") { - child.shouldersTat = 0; - } - if (typeof child.lipsTat !== "string") { - child.lipsTat = 0; - } - if (typeof child.boobsTat !== "string") { - child.boobsTat = 0; - } - if (typeof child.armsTat !== "string") { - child.armsTat = 0; - } - if (typeof child.backTat !== "string") { - child.backTat = 0; - } - if (typeof child.stampTat !== "string") { - child.stampTat = 0; - } - if (typeof child.buttTat !== "string") { - child.buttTat = 0; - } - if (typeof child.vaginaTat !== "string") { - child.vaginaTat = 0; - } - if (typeof child.dickTat !== "string") { - child.dickTat = 0; - } - if (typeof child.anusTat !== "string") { - child.anusTat = 0; - } - if (typeof child.legsTat !== "string") { - child.legsTat = 0; - } - if (typeof child.bellyTat !== "string") { - child.bellyTat = 0; - } - if (typeof child.custom.tattoo !== "string") { - child.custom.tattoo = ""; - } -}; - -globalThis.childCosmeticsDatatypeCleanup = function(child) { - child.makeup = Math.clamp(+child.makeup, 0, 8) || 0; - child.nails = Math.clamp(+child.nails, 0, 9) || 0; - child.chastityAnus = Math.clamp(+child.chastityAnus, 0, 1) || 0; - child.chastityPenis = Math.clamp(+child.chastityPenis, 0, 1) || 0; - child.chastityVagina = Math.clamp(+child.chastityVagina, 0, 1) || 0; - child.choosesOwnClothes = Math.clamp(+child.choosesOwnClothes, 0, 1) || 0; - if (typeof child.clothes !== "string") { - child.clothes = "no clothing"; - } - if (typeof child.collar !== "string") { - child.collar = "none"; - } - if (typeof child.shoes !== "string") { - child.shoes = "none"; - } - if (typeof child.eyewear !== "string") { - child.eyewear = "none"; - } - if (typeof child.markings !== "string") { - child.markings = "none"; - } - if (typeof child.bellyAccessory !== "string") { - child.bellyAccessory = "none"; - } - if (typeof child.vaginalAccessory !== "string") { - child.vaginalAccessory = "none"; - } - if (typeof child.vaginalAttachment !== "string") { - child.vaginalAttachment = "none"; - } - if (typeof child.dickAccessory !== "string") { - child.dickAccessory = "none"; - } - if (typeof child.armAccessory !== "string") { - child.armAccessory = "none"; - } - if (typeof child.legAccessory !== "string") { - child.legAccessory = "none"; - } - if (typeof child.buttplug !== "string") { - child.buttplug = "none"; - } - if (typeof child.buttplugAttachment !== "string") { - child.buttplugAttachment = "none"; - } - if (typeof child.headAccessory !== "string") { - child.headAccessory = "none"; - } - if (typeof child.rearAccessory !== "string") { - child.rearAccessory = "none"; - } - if (typeof child.backAccessory !== "string") { - child.backAccessory = "none"; - } -}; - -globalThis.childDietDatatypeCleanup = function(child) { - if (typeof child.diet !== "string") { - child.diet = "healthy"; - } - child.dietCum = Math.clamp(+child.dietCum, 0, 2) || 0; - child.dietMilk = Math.clamp(+child.dietMilk, 0, 2) || 0; - child.onDiet = Math.clamp(+child.onDiet, 0, 1) || 0; - child.hormones = Math.clamp(+child.hormones, -2, 2) || 0; - child.hormoneBalance = Math.clamp(+child.hormoneBalance, -400, 400) || 0; - if (typeof child.drugs !== "string" || child.drugs === "none") { - child.drugs = "no drugs"; - } - child.aphrodisiacs = Math.clamp(+child.aphrodisiacs, 0, 2) || 0; - child.curatives = Math.clamp(+child.curatives, 0, 2) || 0; -}; - -globalThis.childPornDatatypeCleanup = function(child) { - child.porn.feed = Math.clamp(+child.porn.feed, 0, 1) || 0; - child.porn.viewerCount = Math.max(+child.porn.viewerCount, 0) || 0; - child.porn.spending = Math.max(+child.porn.spending, 0) || 0; - child.porn.prestige = Math.clamp(+child.porn.prestige, 0, 3) || 0; - if (typeof child.porn.prestigeDesc !== "string") { - child.porn.prestigeDesc = 0; - } - if (typeof child.porn.fameType !== "string") { - child.porn.fameType = "none"; - } - if (typeof child.porn.focus !== "string") { - child.porn.focus = "none"; - } - for (const genre of App.Porn.getAllGenres()) { - child.porn.fame[genre.fameVar] = Math.max(+child.porn.fame[genre.fameVar], 0) || 0; - } -}; - -globalThis.childRelationDatatypeCleanup = function(child) { - child.mother = +child.mother || 0; - child.father = +child.father || 0; - child.canRecruit = Math.clamp(+child.canRecruit, 0, 1) || 0; - child.relationship = Math.clamp(+child.relationship, -3, 5) || 0; - child.relationshipTarget = Math.max(+child.relationshipTarget, 0) || 0; - child.rivalryTarget = Math.max(+child.rivalryTarget, 0) || 0; - child.rivalry = Math.clamp(+child.rivalry, 0, 3) || 0; -}; - -globalThis.childSkillsDatatypeCleanup = function(child) { - child.skill.oral = Math.clamp(+child.skill.oral, 0, 100) || 0; - child.skill.vaginal = Math.clamp(+child.skill.vaginal, 0, 100) || 0; - child.skill.anal = Math.clamp(+child.skill.anal, 0, 100) || 0; - child.skill.whoring = Math.clamp(+child.skill.whoring, 0, 100) || 0; - child.skill.entertainment = Math.clamp(+child.skill.entertainment, 0, 100) || 0; - child.skill.combat = Math.clamp(+child.skill.combat, 0, 1) || 0; - child.skill.headGirl = Math.clamp(+child.skill.headGirl, 0, 200) || 0; - child.skill.recruiter = Math.clamp(+child.skill.recruiter, 0, 200) || 0; - child.skill.bodyguard = Math.clamp(+child.skill.bodyguard, 0, 200) || 0; - child.skill.madam = Math.clamp(+child.skill.madam, 0, 200) || 0; - child.skill.DJ = Math.clamp(+child.skill.DJ, 0, 200) || 0; - child.skill.nurse = Math.clamp(+child.skill.nurse, 0, 200) || 0; - child.skill.teacher = Math.clamp(+child.skill.teacher, 0, 200) || 0; - child.skill.attendant = Math.clamp(+child.skill.attendant, 0, 200) || 0; - child.skill.matron = Math.clamp(+child.skill.matron, 0, 200) || 0; - child.skill.stewardess = Math.clamp(+child.skill.stewardess, 0, 200) || 0; - child.skill.milkmaid = Math.clamp(+child.skill.milkmaid, 0, 200) || 0; - child.skill.farmer = Math.clamp(+child.skill.farmer, 0, 200) || 0; - child.skill.wardeness = Math.clamp(+child.skill.wardeness, 0, 200) || 0; - child.skill.servant = Math.clamp(+child.skill.servant, 0, 200) || 0; - child.skill.entertainer = Math.clamp(+child.skill.entertainer, 0, 200) || 0; - child.skill.whore = Math.clamp(+child.skill.whore, 0, 200) || 0; -}; - -globalThis.childStatCountDatatypeCleanup = function(child) { - child.counter.oral = Math.max(+child.counter.oral, 0) || 0; - child.counter.vaginal = Math.max(+child.counter.vaginal, 0) || 0; - child.counter.anal = Math.max(+child.counter.anal, 0) || 0; - child.counter.publicUse = Math.max(+child.counter.publicUse, 0) || 0; - child.counter.mammary = Math.max(+child.counter.mammary, 0) || 0; - child.counter.penetrative = Math.max(+child.counter.penetrative, 0) || 0; - child.counter.pitKills = Math.max(+child.counter.pitKills, 0) || 0; - child.counter.milk = Math.max(+child.counter.milk, 0) || 0; - child.counter.cum = Math.max(+child.counter.cum, 0) || 0; - child.counter.births = Math.max(+child.counter.births, 0) || 0; - child.counter.birthsTotal = Math.max(+child.counter.birthsTotal, 0) || child.counter.births; - child.counter.laborCount = Math.max(+child.counter.laborCount, 0) || child.counter.birthsTotal; - child.childsFathered = Math.max(+child.childsFathered, 0) || 0; - child.counter.PCChildrenFathered = Math.max(+child.counter.PCChildrenFathered, 0) || 0; - child.childsKnockedUp = Math.max(+child.childsKnockedUp, 0) || 0; - child.counter.PCKnockedUp = Math.max(+child.counter.PCKnockedUp, 0) || 0; - child.bodySwap = Math.max(+child.bodySwap, 0) || 0; -}; - -globalThis.childPreferencesDatatypeCleanup = function(child) { - child.energy = Math.clamp(+child.energy, 0, 100) || 0; - child.need = Math.max(+child.need, 0) || 0; - child.attrXY = Math.clamp(+child.attrXY, 0, 100) || 0; - child.attrXX = Math.clamp(+child.attrXX, 0, 100) || 0; - child.attrKnown = Math.clamp(+child.attrKnown, 0, 1) || 0; - child.fetishStrength = Math.clamp(+child.fetishStrength, 0, 100) || 0; - child.fetishKnown = Math.clamp(+child.fetishKnown, 0, 1) || 0; -}; - -globalThis.childRulesDatatypeCleanup = function(child) { - child.breedingMark = Math.clamp(+child.breedingMark, 0, 1) || 0; - child.rudeTitle = Math.clamp(+child.rudeTitle, 0, 1) || 0; -}; - -globalThis.childCustomStatsDatatypeCleanup = function(child) { - if (typeof child.custom.label !== "string") { - child.custom.label = ""; - } - if (typeof child.custom.desc !== "string") { - child.custom.desc = ""; - } - if (typeof child.custom.title !== "string") { - child.custom.title = ""; - } - if (typeof child.custom.titleLisp !== "string") { - child.custom.titleLisp = ""; - } - if (child.custom.image !== null) { - if (typeof child.custom.image.filename !== "string") { - child.custom.image = null; - } - } -}; - -globalThis.childMiscellaneousDatatypeCleanup = function(child) { - child.weekAcquired = Math.max(+child.weekAcquired, 0) || 0; - child.prestige = Math.clamp(+child.prestige, 0, 3) || 0; - child.devotion = Math.clamp(+child.devotion, -100, 100) || 0; - child.oldDevotion = Math.clamp(+child.oldDevotion, -100, 100) || 0; - child.trust = Math.clamp(+child.trust, -100, 100) || 0; - child.oldTrust = Math.clamp(+child.oldTrust, -100, 100) || 0; - child.chem = Math.max(+child.chem, 0) || 0; - child.addict = Math.max(+child.addict, 0) || 0; - child.intelligence = Math.clamp(+child.intelligence, -100, 100) || 0; - child.intelligenceImplant = Math.clamp(+child.intelligenceImplant, 0, 30) || 0; - child.premature = Math.clamp(+child.premature, 0, 1) || 0; - child.training = Math.clamp(+child.training, 0, 150) || 0; - child.hears = Math.clamp(+child.hears, -2, 0) || 0; - child.smells = Math.clamp(+child.smells, -1, 0) || 0; - child.tastes = Math.clamp(+child.tastes, -1, 0) || 0; - if (typeof child.earwear !== "string") { - child.earwear = "none"; - } - if (child.voice !== 0) { - child.voice = Math.clamp(+child.voice, 0, 3) || 1; - } - child.electrolarynx = Math.clamp(+child.electrolarynx, 0, 1) || 0; - child.accent = Math.clamp(+child.accent, 0, 4) || 0; -}; - /* Make sure any new PC variables put into use are added to this! */ globalThis.PCDatatypeCleanup = function() { const PC = V.PC; diff --git a/src/data/backwardsCompatibility/updateSlaveObject.js b/src/data/backwardsCompatibility/updateSlaveObject.js index 0c05bba36abed80bbc64e9e091907baa85b73fd8..0e63c24a3c0498114559e63f64870f2c5a23a9ba 100644 --- a/src/data/backwardsCompatibility/updateSlaveObject.js +++ b/src/data/backwardsCompatibility/updateSlaveObject.js @@ -1007,6 +1007,10 @@ App.Update.Slave = function(slave, genepool = false) { delete slave.relationTarget; delete slave.recruiter; + if (slave.spermY === undefined) { + slave.spermY = normalRandInt(50, 3); // narrower range to avoid surprises + } + if (slave.geneticQuirks.albinism === 2 && !slave.albinismOverride) { induceAlbinism(slave, 2); } diff --git a/src/events/RECI/butthole.js b/src/events/RECI/butthole.js new file mode 100644 index 0000000000000000000000000000000000000000..a1a95a2ba3a61500f6505240f36fbd9ef7213df1 --- /dev/null +++ b/src/events/RECI/butthole.js @@ -0,0 +1,786 @@ +App.Events.RECIButthole = class RECIButthole 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 => V.REButtholeCheckinIDs.includes(s.ID), + s => s.assignment !== Job.QUARTER, + s => s.devotion > 50, + s => s.trust > 50, + canTalk, + canWalk, + canSee, + canHear, + s => s.anus > 1 && s.anus < 4, + s => s.analArea > 1, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + // eslint-disable-next-line no-unused-vars + He, he, His, his, hers, him, himself, girl, woman, loli + } = getPronouns(eventSlave); + const {title: Master, say: say} = getEnunciation(eventSlave); + const belly = bellyAdjective(eventSlave); + const hands = hasBothArms(eventSlave) ? "hands" : "hand"; + const skinDesc = (skinToneLevel(eventSlave.skin) < 10) + ? "pink" + : (skinToneLevel(eventSlave.skin) < 10) + ? "dark brown" + : "brown"; + + V.nextLink = "Next Week"; + V.REButtholeCheckinIDs.deleteWith((s) => s === eventSlave.ID); + + let artDiv = document.createElement("div"); // named container so we can replace it later + App.Events.drawEventArt(artDiv, eventSlave, "no clothing"); + node.appendChild(artDiv); + + let t = []; + t.push(`The slave bathrooms are designed to completely eliminate privacy. There are few partitions, and those are glass. Your better-behaved slaves have all long since lost any hesitation about performing their ablutions nude. As you pass through the area, you notice`); + t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave)); + t.push(`checking out ${his} own anus in the bathroom mirror`); + App.Events.addParagraph(node, t); + + t = []; + t.push(`There's no other way to describe what ${he}'s doing: the ${SlaveTitle(eventSlave)}`); + if (eventSlave.belly >= 300000) { + t.push(`is leaning over ${his} ${belly} belly with ${his} feet planted on the counter,`); + } else if (eventSlave.height < 140) { + t.push(`is on a step stool with ${his} back to the mirror,`); + } else if (eventSlave.height < 160) { + t.push(`has ${his} back to the mirror and is up on tiptoe to bring ${his} butthole into view,`); + } else { + t.push(`has ${his} back to the mirror,`); + } + t.push(`and ${he}'s`); + if (eventSlave.butt > 6) { + if (hasBothArms(eventSlave)) { + t.push(`using both hands to`); + } else if (hasAnyArms(eventSlave)) { + t.push(`using ${his} hand to`); + } else if (eventSlave.belly >= 300000) { + t.push(`letting gravity`); + } else { + t.push(`using the edge of the sink to`); + } + t.push(`pull ${his} massive buttcheeks apart to`); + } else if (eventSlave.butt > 3) { + if (hasAnyArms(eventSlave)) { + t.push(`using ${his} ${hands} to`); + } else if (eventSlave.belly >= 300000) { + t.push(`letting gravity`); + } else { + t.push(`using the edge of the sink to`); + } + t.push(`spread ${his} healthy buttcheeks to`); + } else { + t.push(`got ${his} hips cocked to spread ${his} sleek butt and`); + } + t.push(`reveal ${his} backdoor. Your slaves are trained to check themselves daily,`); + if (eventSlave.chastityAnus) { + t.push(`including those assigned to wear anal chastity,`); + } + t.push(`but ${he} seems fascinated. As you pause to watch, ${he} begins to clench and relax ${his}`); + if (eventSlave.anus > 2) { + t.push(`loose`); + } else { + t.push(`cute`); + } + t.push(`hole,`); + if ((eventSlave.analArea - eventSlave.anus) > 1) { + t.push(`lewdly flexing`); + } else { + t.push(`alternately puckering and relaxing`); + } + t.push(`the ${skinDesc} skin around it. ${He} giggles self-consciously at the sight, and then relaxes all the way, causing ${his} asspussy to open into a`); + if (eventSlave.anus > 2) { + if (V.PC.dick !== 0) { + t.push(`cock-hungry`); + } else { + t.push(`dildo-hungry`); + } + } else { + t.push(`slight`); + } + t.push(`gape. ${He} notices you out of the corner of ${his} eye and`); + if (eventSlave.butt > 6) { + if (eventSlave.belly >= 300000) { + t.push(`slides back onto ${his} feet`); + } else if (hasAnyArms(eventSlave)) { + t.push(`releases ${his} grip on ${his} heavy buttocks`); + } else { + t.push(`slides ${his} heavy buttocks off the counter`); + } + t.push(`to turn and greet you, letting`); + if (eventSlave.belly >= 300000) { + t.push(`${his} heavy buttocks`); + } else { + t.push(`them`); + } + t.push(`clap gently together and conceal ${his} asshole again.`); + } else if (eventSlave.butt > 3) { + if (eventSlave.belly >= 300000) { + t.push(`slides back onto ${his} feet`); + } else if (hasAnyArms(eventSlave)) { + t.push(`lets ${his} butt go`); + } else { + t.push(`slides ${his} butt off the counter`); + } + t.push(`to turn and greet you, mostly hiding ${his} asshole from the mirror.`); + } else { + if (eventSlave.belly >= 300000) { + t.push(`slides back onto ${his} feet and`); + } + t.push(`turns to greet you, ${his} pretty rear only partially concealing ${his} asshole in the mirror.`); + } + App.Events.addParagraph(node, t); + + t = []; + t.push(Spoken(eventSlave, `"Hi ${Master},"`)); + t.push(`${he} ${say}s cheerfully.`); + t.push(Spoken(eventSlave, `"I was just noticing how much my butt has changed. I check it every day, but I hadn't really looked at it in a while, you know? It used to be so tight, and now`)); + if (eventSlave.anus > 2) { + t.push(Spoken(eventSlave, `I've got a rear pussy."`)); + } else { + t.push(Spoken(eventSlave, `it's obviously a fuckhole."`)); + } + if (eventSlave.belly >= 300000) { + t.push(`${He} struggles to hike ${his} knee over ${his} extreme gravidity without losing balance.`); + } else { + t.push(`${He} turns to face the mirror,`); + if (eventSlave.belly >= 10000) { + t.push(`slowly hiking one knee up onto the bathroom counter in front of it while giving ${his}`); + if (eventSlave.belly >= 10000) { + if (eventSlave.bellyPreg >= 3000) { + t.push(`pregnancy`); + } else { + t.push(`greatly bloated middle`); + } + t.push(`room to hang.`); + } + } else { + t.push(`hiking one knee up onto the bathroom counter in front of it.`); + } + } + t.push(`${He}`); + if (eventSlave.butt > 6) { + t.push(`reaches around to pull a buttock aside and starts blatantly winking ${his} anus for`); + if (hasAnyArms(eventSlave)) { + t.push(`you, using ${his}`); + if (hasBothArms(eventSlave)) { + t.push(`other`); + } + t.push(`hand to`); + if (eventSlave.nipples !== "fuckable") { + t.push(`tweak`); + } else { + t.push(`finger`); + } + t.push(`a nipple.`); + } else { + t.push(`you.`); + } + } else if (eventSlave.butt > 3) { + t.push(`spreads ${himself} and starts blatantly winking ${his} anus for`); + if (hasAnyArms(eventSlave)) { + t.push(`you, using ${his} ${hands} to`); + if (eventSlave.nipples !== "fuckable") { + t.push(`tweak`); + } else { + t.push(`finger`); + } + t.push(`${his} nipples.`); + } else { + t.push(`you.`); + } + } else { + t.push(`cocks ${his} hips again and starts blatantly winking ${his} anus for you`); + if (hasAnyArms(eventSlave)) { + t.push(`you, using ${his} ${hands} to`); + if (eventSlave.nipples !== "fuckable") { + t.push(`tweak`); + } else { + t.push(`finger`); + } + t.push(`${his} nipples.`); + } else { + t.push(`you.`); + } + } + if (eventSlave.analArea > 3) { + t.push(`The huge area of ${skinDesc} anus around ${his} actual hole certainly draws the eye towards its center, though the way ${he}'s using ${his} sphincter as a come-on does enhance the effect.`); + } + t.push(Spoken(eventSlave, `"Please, ${Master},"`)); + if (eventSlave.fetish === "buttslut") { + t.push(`${he} begins to beg.`); + t.push(Spoken(eventSlave, `"I can't wait to feel ${V.PC.dick !== 0 ? 'your cock' : 'you'} inside me."`)); + } else { + t.push(`${he} ${say}s.`); + t.push(Spoken(eventSlave, `"Use me."`)); + } + App.Events.addParagraph(node, t); + + App.Events.addResponses(node, [ + (eventSlave.chastityAnus) + ? new App.Events.Result(`Remind ${him} of ${his} chastity`, chaste) + : new App.Events.Result(), + (V.HeadGirl !== 0 && eventSlave.ID !== V.HeadGirl.ID) + ? new App.Events.Result(`Double anal with the Head Girl`, () => DoubleTeam(S.HeadGirl)) + : new App.Events.Result(), + (V.Concubine !== 0 && eventSlave.ID !== V.Concubine.ID && hasAnyLegs(S.Concubine) && hasAnyArms(S.Concubine) && S.Concubine.fetish !== "mindbroken") + ? new App.Events.Result(`Double anal with your Concubine`, () => DoubleTeam(S.Concubine)) + : new App.Events.Result(), + (V.Bodyguard !== 0 && eventSlave.ID !== V.Bodyguard.ID) + ? new App.Events.Result(`Double anal with your Body Guard`, () => DoubleTeam(S.Bodyguard)) + : new App.Events.Result(), + new App.Events.Result(`Chat about ${his} ass`, talk), + (eventSlave.anus < 3) + ? new App.Events.Result(`Change it some more`, assFuck) + : new App.Events.Result(), + new App.Events.Result(`Don't like anal`, wrongHole), + ]); + + function chaste() { + const totalIntel = eventSlave.intelligence + eventSlave.intelligenceImplant; + + t = []; + t.push(`You ask if ${he} is forgetting anything.`); + if (totalIntel > 95) { + t.push(Spoken(eventSlave, `"Ah! Forgive me ${Master}! I'll put it on right away!"`)); + t.push(`${he} ${say}s, hurrying to fasten ${his} anal chastity, a hint of fear on ${his} face. You tell ${him} it is fine, ${he} was only performing ${his} daily ablutions after all.`); + } else if (totalIntel > 15) { + t.push(Spoken(eventSlave, `"Um? No...? I don't think I'm forgetting anything?"`)); + t.push(`${he} states with a look of confusion. You press ${him}, asking if ${he} forgot the rules.`); + t.push(Spoken(eventSlave, `"Ah! I'm not supposed to be offering my asshole so freely! ${Master}, please forgive me! I'll put it on right away!"`)); + t.push(`${he} shouts, hurrying to fasten ${his} anal chastity, <span class="trust dec">a hint of fear on ${his} face.</span> You tell ${him} it is fine, if you want ${his} ass, you will have it, chastity be damned. ${He} lets out a sigh of relief.`); + eventSlave.trust -= 2; + } else if (totalIntel >= -15) { + t.push(Spoken(eventSlave, `"Um? No...? I don't think I'm forgetting anything?"`)); + t.push(`${he} states with a look of confusion. You press ${him}, asking if ${he} forgot the rules.`); + t.push(Spoken(eventSlave, `"I need to inspect my anus for damage, elasticity and cleanliness each and every morning."`)); + t.push(`You stare ${him} down, making it clear that was not the right answer.`); + t.push(Spoken(eventSlave, `"Um, ${Master}, I shouldn't be offering my ass to you, I'm sorry..."`)); + t.push(`${he} limply ${say}s, <span class="trust dec">fear spreading across ${his} face.</span> You tell ${him} it is fine, ${he} did not violate the rules, after all. Though ${he}'d best pay more attention in the future.`); + eventSlave.trust -= 2; + } else if (totalIntel >= -95) { + t.push(Spoken(eventSlave, `"Um? No...? I pretty sure I'm not forgetting anything..."`)); + t.push(`${he} states with a look of confusion. You press ${him}, asking if ${he} forgot the rules.`); + t.push(Spoken(eventSlave, `"Make sure your asspussy is nice and pretty each and every day!"`)); + t.push(`You stare ${him} down, making it clear that was not the right answer. ${He} wracks ${his} brain, desperately trying to figure out what ${he} could be missing.`); + t.push(Spoken(eventSlave, `"I offered my ass to you, so that couldn't be it..."`)); + t.push(`${His} cluelessness is starting to get on your nerves. You clear your throat and gesture at the anal chastity left forgotten in the sink.`); + t.push(Spoken(eventSlave, `"Huh? Is that mine? Wait... Oh, no... I'm sorry ${Master}... Please forgive me..."`)); + t.push(`${he} ${say}s, <span class="trust dec">tears beginning to well up in ${his} eyes.</span> You tell ${him} it is fine, ${he} did not violate the rules, after all. Though ${he}'d best pay more attention in the future. Also not to leave ${his} chastity in the sink, you don't need to be replacing them all the time.`); + eventSlave.trust -= 2; + } else { + t.push(Spoken(eventSlave, `"Um? No?"`)); + t.push(`${he} states with a look of confusion. You press ${him}, asking if ${he} forgot the rules.`); + t.push(Spoken(eventSlave, `"Look at your butt!"`)); + t.push(`You stare ${him} down, making it clear that was not the right answer. ${He} wracks ${his} brain, desperately trying to figure out what ${he} could be missing.`); + t.push(Spoken(eventSlave, `"You don't like this position...?"`)); + t.push(`${His} cluelessness is starting to get on your nerves. You clear your throat and gesture at the anal chastity left forgotten on the counter.`); + t.push(Spoken(eventSlave, `"Huh? You want me to put that away?"`)); + t.push(`You struggle to calmly explain that ${he} is supposed to be wearing anal chastity, not begging for a dick up ${his} ass.`); + t.push(Spoken(eventSlave, `"So a toy is better?"`)); + t.push(`You fasten the belt around ${his} rear and silently leave the room before you lose it.`); + t.push(Spoken(eventSlave, `"So you'll fuck my butt later?"`)); + t.push(`${he} shouts after you, still completely oblivious.`); + } + + return t; + } + + function DoubleTeam(partner) { + let container = document.createDocumentFragment(); + const partnerSlave = partner; + const { + // eslint-disable-next-line no-unused-vars + He2, he2, His2, his2, hers2, him2, himself2, girl2 + } = getPronouns(partnerSlave).appendSuffix('2'); + const {title: Master2} = getEnunciation(partnerSlave); + + // replace slave art + $(artDiv).empty(); + App.Events.drawEventArt(artDiv, [eventSlave, partnerSlave], "no clothing"); + + t = []; + t.push(`You tell ${him} ${he}'s got a nice asspussy, and grope ${him} thoroughly, cupping ${his} buttocks with one hand and squeezing a breast with the other. ${eventSlave.slaveName} looks`); + if (eventSlave.fetish === "buttslut") { + t.push(`desperately eager,`); + } else { + t.push(`ready and willing,`); + } + t.push(`and angles ${himself} just right, but you administer a light slap to ${his} ${eventSlave.skin} ass and continue, telling ${him} that it's so nice you feel like sharing it. ${He}'s`); + if (eventSlave.fetish === "buttslut" || eventSlave.energy > 95) { + t.push(`so ready to fuck ${he} can't quite think of what to say,`); + } else { + t.push(`not quite sure how to respond,`); + } + t.push(`and before ${he} can figure it out, ${partnerSlave.slaveName} hurries in, responding to your summons. Of course, ${eventSlave.slaveName} is no stranger to ${partnerSlave.slaveName}, who takes in the situation at a glance and`); + if (canAchieveErection(partnerSlave)) { + t.push(`instantly achieves a painfully hard erection.`); + } else { + t.push(`immediately flushes with arousal.`); + } + if (partnerSlave.weight > 160 || partnerSlave.belly >= 10000 || partnerSlave.boobs >= 50000 || partnerSlave.balls >= 50) { + if (!canPenetrate(partnerSlave)) { + t.push(`${partnerSlave.slaveName} dons a strap-on before you help ${him2}`); + } else { + t.push(`You help support ${partnerSlave.slaveName} as ${he2} struggles`); + } + } else { + t.push(`${partnerSlave.slaveName}`); + if (!canPenetrate(partnerSlave)) { + t.push(`dons a strap-on and`); + } + t.push(`clambers`); + } + t.push(`up onto the (strongly built) bathroom counter. Since saliva is plenty of lube for ${eventSlave.slaveName}'s experienced ass, ${he2} points a meaningful finger at`); + if (!canPenetrate(partnerSlave)) { + t.push(`the phallus,`); + } else { + t.push(`${his2} cock,`); + } + t.push(`and ${eventSlave.slaveName} begins to suck it enthusiastically, trying to get it as wet as possible for the sake of ${his} butt.`); + seX(eventSlave, "oral", partnerSlave, "penetrative"); + App.Events.addParagraph(container, t); + + t = []; + t.push(`Since ${eventSlave.slaveName} is being so good, you decide to help get ${him} ready, and push`); + if (eventSlave.belly < 100000) { + t.push(`${him} sideways so`); + if (eventSlave.belly >= 3000) { + t.push(`${he}'s forced to heft ${his}`); + if (eventSlave.bellyPreg >= 3000) { + t.push(`pregnancy`); + } else { + t.push(`greatly bloated middle`); + } + t.push(`onto the counter.`); + } else { + t.push(`${he} straddles the counter's edge.`); + } + t.push(`${He} whimpers into the`); + if (!canPenetrate(partnerSlave)) { + t.push(`dildo`); + } else { + t.push(`dick`); + } + t.push(`in ${his} mouth as ${he} feels ${his}`); + if (eventSlave.dick > 0) { + if (eventSlave.chastityPenis === 1) { + t.push(`chastity cage`); + } else if (eventSlave.hormoneBalance >= 100 || eventSlave.balls === 0 || eventSlave.ballType === "sterile") { + t.push(`soft dickclit`); + } else if (!canAchieveErection(eventSlave)) { + t.push(`oversized cock`); + } else { + t.push(`hard cock`); + } + } else { + t.push(`mons`); + } + t.push(`graze the hard counter, and then stiffens as you penetrate ${his} bottom.`); + } else { + if (eventSlave.bellyPreg >= 3000) { + t.push(`the obscenely pregnant`); + } else { + t.push(`the obscenely swollen`); + } + t.push(`${girl} to properly spitroast ${him}. ${He} whimpers into the`); + if (!canPenetrate(partnerSlave)) { + t.push(`dildo`); + } else { + t.push(`dick`); + } + t.push(`in ${his} mouth as ${his} body stiffens from your invading`); + if (V.PC.dick !== 0) { + t.push(`cock`); + } else { + t.push(`strap-on`); + } + t.push(`stretching ${his} anus.`); + } + seX(eventSlave, "anal", V.PC, "penetrative"); + t.push(`When you judge that ${partner.slaveName} is wet enough, you nod to ${him2}, and ${he2} takes ${eventSlave.slaveName} by the hand, pulling ${him} up onto ${his2} lap.`); + if (partnerSlave.belly + eventSlave.belly > 5000 || partnerSlave.weight > 95 || eventSlave.weight > 95) { + t.push(`There is no chance that the pair of them will manage to stay on that counter without hurting themselves or breaking something, so you quickly help them down onto a bathroom bench before the moment is ruined.`); + } else if (partnerSlave.boobs > 4000 && eventSlave.boobs > 4000) { + t.push(`Their tits are so huge that they can't reach each other to kiss, chest-to-chest like that. ${partnerSlave.slaveName} settles for blowing the other slave an exaggerated kiss, which makes ${him} laugh.`); + } else { + t.push(`The slaves start making out, showing no signs of breaking their lip lock as they arrange themselves for penetration.`); + } + t.push(`${partnerSlave.slaveName} guides ${his2}`); + if (!canPenetrate(partnerSlave)) { + t.push(`strap-on`); + } else { + t.push(`cock`); + } + t.push(`inside the`); + if (eventSlave.fetish === "buttslut") { + t.push(`enthusiastic`); + } else { + t.push(`compliant`); + } + t.push(`${eventSlave.slaveName}, who begins to ride it, enjoying both the`); + if (eventSlave.prostate > 0) { + t.push(`prostate`); + } else { + t.push(`anal`); + } + t.push(`stimulation and the feeling of ${his}`); + if (eventSlave.dick > 0) { + if (eventSlave.chastityPenis === 1) { + t.push(`midsection`); + } else if (eventSlave.hormoneBalance >= 100 || eventSlave.balls === 0 || eventSlave.ballType === "sterile") { + t.push(`soft dick`); + } else if (!canAchieveErection(eventSlave)) { + t.push(`oversized cock`); + } else { + t.push(`erection`); + } + t.push(`trapped between ${him} and`); + } else { + t.push(`pussy pressed against`); + } + t.push(`${partnerSlave.slaveName}.`); + seX(eventSlave, "anal", partnerSlave, "penetrative"); + t.push(`${partnerSlave.slaveName} smacks the humping`); + if (eventSlave.physicalAge > 30) { + t.push(`${woman}'s`); + } else if (eventSlave.physicalAge > 17) { + t.push(`${girl}'s`); + } else if (eventSlave.physicalAge > 12) { + t.push(`teen's`); + } else { + t.push(`${loli}'s`); + } + t.push(`butt to get ${him} to stop, and slides an index finger up ${his} ass alongside the`); + if (!canPenetrate(partnerSlave)) { + t.push(`phallus.`); + } else { + t.push(`cock.`); + } + t.push(`${eventSlave.slaveName} shudders, and then begins to whine as ${partnerSlave.slaveName} pulls ${his} sphincter wider.`); + App.Events.addParagraph(container, t); + + t = []; + t.push(Spoken(eventSlave, `"Please,"`)); + t.push(`the slave begs incoherently as you press your`); + if (V.PC.dick !== 0) { + t.push(`dick`); + } else { + t.push(`strap-on`); + } + t.push(`against ${partnerSlave.slaveName}'s finger. It's not clear whether ${he}'s begging you to DP ${his} anus, or begging you not to, but whichever it is, ${partnerSlave.slaveName} withdraws ${his2} finger and you shove yourself inside. ${eventSlave.slaveName} jerks with discomfort and gives a gasping "Oh f-fuck-k" that`); + if (eventSlave.anus > 2) { + t.push(`${he} repeats over and over`); + } else { + t.push(`is followed by some minor struggling`); + } + t.push(`as you begin to fuck ${him}.`); + seX(eventSlave, "anal", V.PC, "penetrative"); + seX(eventSlave, "anal", partnerSlave, "penetrative"); + if (V.PC.belly + eventSlave.belly + partnerSlave.belly >= 7500) { + t.push(`The only position you can all manage to squeeze in together doesn't quite allow either of you to pound ${eventSlave.slaveName} as hard as you'd like, but you and ${partnerSlave.slaveName} do your best.`); + } else { + t.push(`From ${his2} angle, ${partnerSlave.slaveName} can't pound ${eventSlave.slaveName} quite as hard as you can, but ${he2} does ${his2} best.`); + } + t.push(`When you've both had your fun, extracted yourselves, and let the exhausted, gaped bitch collapse onto the floor, ${partnerSlave.slaveName} gives you a naughty wink.`); + t.push(`<span class="devotion inc">`); + if (canTalk(partnerSlave)) { + t.push(Spoken(partnerSlave, `"That was fun, ${Master2}!"`)); + } else { + t.push(`${He2} quite enjoyed ${himself2}`); + } + t.push(`</span>`); + if (canTalk(partnerSlave)) { + t.push(`${he2} ${say}s.`); + t.push(Spoken(partnerSlave, `"Shall we flip ${him} over and go again?"`)); + } else { + t.push(`and would be happy to go for round two.`); + } + t.push(`<span class="devotion inc">`); + t.push(Spoken(eventSlave, `"Please nooo,"`)); + t.push(`</span>`); + t.push(`comes a quiet wail from the floor.`); + App.Events.addParagraph(container, t); + + eventSlave.devotion += 2; + partnerSlave.devotion += 2; + + return [container]; + } + + function talk() { + let container = document.createDocumentFragment(); + const {heP} = getSpokenPronouns(V.PC, eventSlave).appendSuffix('P'); + t = []; + + t.push(`You head into the bathroom, shedding clothing as you go. ${He} stares at you as you advance, ${his} eyes fixing on your`); + if (V.PC.boobs >= 1400) { + t.push(`enormous tits as you reveal them,`); + } else if (V.PC.boobs >= 1200) { + t.push(`huge tits as you reveal them,`); + } else if (V.PC.boobs >= 1000) { + t.push(`big tits as you reveal them,`); + } else if (V.PC.boobs >= 300) { + t.push(`tits as you reveal them,`); + } else if (V.PC.belly >= 100000) { + t.push(`massive pregnancy as it becomes visible,`); + } else if (V.PC.belly >= 60000) { + t.push(`giant pregnancy as it becomes visible,`); + } else if (V.PC.belly >= 15000) { + t.push(`advanced pregnancy as it becomes visible,`); + } else if (V.PC.belly >= 10000) { + t.push(`big baby bump as it becomes visible,`); + } else if (V.PC.belly >= 5000) { + t.push(`baby bump as it becomes visible,`); + } else if (V.PC.belly >= 1500) { + t.push(`rounded middle as it becomes visible,`); + } else { + if (V.PC.title === 0) { + t.push(`flat chest as you reveal it,`); + } else { + t.push(`ripped abs as they become visible,`); + } + } + t.push(`and ${his} lips part slightly. ${His} gaze only shifts when you disrobe completely, revealing your`); + if (V.PC.dick !== 0) { + t.push(`hardening`); + if (V.PC.vagina !== -1) { + t.push(`dick and`); + } else { + t.push(`dick;`); + } + } else if (V.PC.vagina !== -1) { + t.push(`flushed womanhood;`); + } + t.push(`${he} licks ${his} lips unconsciously. You grab a towel off the counter, spread it on a bathroom bench, and recline on`); + if (V.PC.belly < 5000) { + t.push(`it with your back against the wall.`); + } else { + t.push(`it.`); + } + t.push(`You pat your`); + // consider muscles and weight here + if (V.PC.title === 1) { + t.push(`hard`); + } else { + t.push(`pretty`); + } + t.push(`thighs, and ${he} hurries over,`); + if (eventSlave.fetish === "buttslut" || (eventSlave.fetish === "pregnancy" && V.PC.belly >= 5000)) { + t.push(`eagerly`); + } else { + t.push(`carefully`); + } + t.push(`swinging ${his} leg over the bench and seating ${himself} in your`); + if (V.PC.belly >= 60000) { + t.push(`lap, getting comfortable against your underbelly.`); + } else { + t.push(`lap.`); + } + if (V.PC.dick !== 0) { + t.push(`Your cock slides easily up ${his} whorish butt. One of your arms`); + } else { + t.push(`You decided not to bother with a strap-on, so you slide a couple of fingers inside ${him}, and ${he} reciprocates by working a hand under ${himself} to attend to your pussy. Your free arm`); + } + if (V.PC.belly < 5000) { + t.push(`wraps around`); + if (eventSlave.boobs > 4000) { + t.push(`${him} and under ${his} heavy tits, resting in a cocoon of soft breastflesh.`); + } else if (eventSlave.boobs > 800) { + t.push(`${his} heavy breasts, hefting their weight and eliciting a sigh from the slave.`); + } else if (eventSlave.belly >= 5000) { + if (eventSlave.bellyPreg > 3000) { + t.push(`${his} waist to support ${his} pregnancy.`); + } else if (eventSlave.bellyImplant > 3000) { + t.push(`${his} waist to support the weight of ${his} belly.`); + } else { + t.push(`${his} waist to stabalize ${his} bloated middle.`); + } + } else if (eventSlave.weight > 95) { + t.push(`${his} stomach to better support ${his} weight.`); + } else if (eventSlave.boobs > 400) { + t.push(`${him} to support ${his} chest.`); + } else { + t.push(`${him} to support ${his} weight.`); + } + } else { + t.push(`grabs as good a hold as you can get in your state on`); + if (eventSlave.weight > 95) { + t.push(`${his} love handle.`); + } else if (eventSlave.hips > 2) { + t.push(`${his} massive hip.`); + } else if (eventSlave.hips >= 2) { + t.push(`${his} wide hip.`); + } else if (eventSlave.hips >= 1) { + t.push(`${his} womanly hip.`); + } else if (eventSlave.hips >= 0) { + t.push(`${his} hip.`); + } else if (eventSlave.hips >= -1) { + t.push(`${his} narrow hip.`); + } else { + t.push(`what should be a hip.`); + } + } + t.push(`Being held this way, ${he} can't really`); + if (V.PC.dick !== 0) { + t.push(`bounce on your dick, so ${he} just wiggles ${his} butt into you to seat it a bit deeper`); + } else { + t.push(`grind against your fingers`); + } + t.push(`and sighs contentedly. You instruct ${him} to elaborate on what ${he} said earlier.`); + App.Events.addParagraph(container, t); + + t = []; + t.push(Spoken(eventSlave, `"Yes ${Master},"`)); + t.push(`${he} ${say}s automatically, and then pauses.`); + t.push(Spoken(eventSlave, `"Hmm. I try not to think about back, you know, before."`)); + t.push(`${He} squeezes ${his} buttocks against your`); + if (V.PC.dick !== 0) { + t.push(`crotch.`); + } else { + t.push(`hand.`); + } + t.push(Spoken(eventSlave, `"But I guess back then I didn't really think about my butthole, much? Like, I went to the bathroom, and washed it in the shower, and that was it. But with the liquid slave food, I don't — sorry, ${Master}, I'm being silly. You know all about that."`)); + t.push(`You tell ${him} to explain it anyway. ${He} looks puzzled for a moment, but <span class="trust inc">remembers ${he} can trust you,</span> and twists around to plant an awkward kiss on your`); + if (V.PC.belly >= 5000) { + t.push(`navel`); + } else { + t.push(`chin`); + } + t.push(`before continuing.`); + t.push(Spoken(eventSlave, `"Well,"`)); + t.push(`${he} ${say}s, with mock seriousness.`); + t.push(Spoken(eventSlave, `"Here in the arcology, we slaves eat a very special liquid diet that keeps us healthy and fit and ready to fuck. And, it's absorbed completely, so our butts are always nice and clean. That way, ${Master} can -"`)); + t.push(`${he} clenches ${his} sphincter`); + if (V.PC.dick !== 0) { + t.push(`around the base of your cock — "fuck`); + } else { + t.push(`against your invading fingers — "play with`); + } + t.push(Spoken(eventSlave, `our asses"`)); + t.push(`— clench —`); + t.push(Spoken(eventSlave, `"whenever"`)); + t.push(`— clench —`); + t.push(Spoken(eventSlave, `"${heP}"`)); + t.push(`— clench —`); + t.push(Spoken(eventSlave, `"wants!"`)); + t.push(`${He} squeals as you use your encircling arm to hoist ${his} torso up a bit higher, and mercilessly`); + if (V.PC.dick !== 0) { + t.push(`fuck`); + } else { + t.push(`fingerfuck`); + } + t.push(`${his} ass. Many of your other slaves came and went during this, and none of them saw anything unusual about you molesting ${eventSlave.slaveName}'s bottom in a corner of the restroom.`); + t.push(VCheck.Anal(1, eventSlave)); + eventSlave.trust += 4; + App.Events.addParagraph(container, t); + + return [container]; + } + + function assFuck() { + let container = document.createDocumentFragment(); + + t = []; + t.push(`You tell ${him} that since ${he} appreciates how ${his} ass has changed, ${he} won't be surprised if you treat it like the fuckhole it is. Something in your tone makes ${him} cautious, but ${he}'s a good ${girl} and ${say}s`); + t.push(Spoken(eventSlave, `"Yes, ${Master},"`)); + t.push(`automatically. You pass ${V.assistant.name} wardrobe orders for the poor`); + if (eventSlave.physicalAge > 30) { + t.push(`${woman},`); + } else if (eventSlave.physicalAge > 17) { + t.push(`${girl},`); + } else if (eventSlave.physicalAge > 12) { + t.push(`teen,`); + } else { + t.push(`${loli},`); + } + t.push(`and instructions to have ${him} report to your office once ${he}'s dressed. A few minutes later, ${eventSlave.slaveName} walks up to your desk, stark naked except for a buttplug that comfortably fills ${his} rectum and a sturdy leather collar attached to a leash. You snap your fingers, pointing at the ground, and ${he}`); + if (eventSlave.belly >= 30000) { + t.push(`struggles`); + } else { + t.push(`scrambles`); + } + if (hasAllLimbs(eventSlave)) { + t.push(`to ${his} hands and knees`); + } else { + t.push(`downwards`); + } + t.push(`and`); + if (hasAnyArms(eventSlave)) { + t.push(`removes ${his} plug.`); + } else { + t.push(`presents ${his} plug for removal.`); + } + t.push(`After ${he}'s taken a harsh buttfuck, you`); + if (V.PC.dick !== 0) { + t.push(`push the plug back in without letting any of your cum escape`); + } else { + t.push(`plug ${him} up again`); + } + t.push(`and attach the leash to your belt. You ignore your anal toy completely, letting ${him} kneel next to you as you work — ${he} doesn't seem to want to sit, for some reason. For the rest of the day, ${his} anus takes the full force of your libido. You fuck nothing else, confining your efforts to ${his} backdoor, keeping ${him} plugged when you aren't penetrating ${him}. When you're bored, you hand ${him} a dildo and tell ${him} to take care of it ${himself}.`); + App.Events.addParagraph(container, t); + + t = []; + t.push(`${He}'s quite exhausted by the end of the day,`); + if (eventSlave.belly >= 10000) { + t.push(`waddling`); + } else { + t.push(`walking`); + } + t.push(`dumbly along behind you, leashed to your belt and wondering tiredly when ${his} next reaming is coming. ${He} doesn't notice that you're bringing ${him} back to stand in front of the mirror until ${he}'s there. You push ${his} compliant body into an approximation of ${his} position from the`); + if (hasAnyArms(eventSlave)) { + t.push(`morning and tell ${him} to remove ${his} plug and`); + } else { + t.push(`morning, pull out ${his} plug, and tell ${him} to`); + } + t.push(`look at ${his} asshole.`); + t.push(Spoken(eventSlave, `"Yes, ${Master},"`)); + t.push(`${he} ${say}s, and obeys.`); + if (V.PC.dick !== 0 && V.PC.balls > 0) { + t.push(`This releases`); + if (V.PC.balls >= 30) { + t.push(`an obscene amount of ejaculate as ${his} stomach deflates slowly.`); + } else if (V.PC.balls >= 14) { + t.push(`a flood of ejaculate.`); + } else if (V.PC.balls >= 9) { + t.push(`a torrent of ejaculate.`); + } else { + t.push(`quite a rush of ejaculate.`); + } + } + t.push(`${His} anus is <span class="change positive">very loose,</span> a lewd, gaping fuckhole hungry for toys, fingers, and dick. You tell ${him} that, and ask whether ${he} agrees. <span class="devotion inc">`); + t.push(Spoken(eventSlave, `"Yes, ${Master},"`)); + t.push(`${he} ${say}s.</span>`); + eventSlave.devotion += 4; + eventSlave.anus = 3; + t.push(VCheck.Anal(6, eventSlave)); + eventSlave.counter.anal += 2; + V.analTotal += 2; + App.Events.addParagraph(container, t); + + return [container]; + } + + function wrongHole() { + t = []; + t.push(`You make it abundantly clear that you and you alone choose what hole you fuck and when, and it will not be ${his} loose asshole.`); + t.push(Spoken(eventSlave, `"Ah! I-I'm sorry ${Master}, I went too far."`)); + t.push(`<span class="devotion dec">${He} looks crestfallen</span> as you take your leave.`); + eventSlave.devotion -= 2; + return t; + } + } +}; diff --git a/src/events/RESS/hotPC.js b/src/events/RESS/hotPC.js index b47820c7b7e17f70623a48527698b6f1bb2b12c8..bd4ae647a5e08852f4aa60d2f46a2dad553734db 100644 --- a/src/events/RESS/hotPC.js +++ b/src/events/RESS/hotPC.js @@ -73,7 +73,7 @@ App.Events.RESSHotPC = class RESSHotPC extends App.Events.BaseEvent { } else if (PC.boobs >= 300) { t.push(`sports bra clad boobs with almost painful intensity. You can't really blame ${him}; the bra is soaked in your sweat ${PC.lactation > 0 ? "and breast milk" : ""} and your nipples are clearly visible as bumps in the tight material.`); } else if (PC.belly >= 1500) { - t.push(`swollen middle and its abdominal muscles with almost painful intensity. You can't really blame ${him}; despite your growing child ${PC.pregType > 1 ? "ren" : ""}, they're still pretty cut.`); + t.push(`swollen middle and its abdominal muscles with almost painful intensity. You can't really blame ${him}; despite your growing child${PC.pregType > 1 ? "ren" : ""}, they're still pretty cut.`); } else if (PC.belly >= 100) { if (PC.title === 0) { t.push(`slightly distended abdominal muscles and flat chest with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your sports bra's soaked in your sweat ${PC.lactation > 0 ? "and breast milk" : ""} and your nipples are clearly visible as bumps in the tight material.`); diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js index a7173ab1cfc24ac70485f7a810237e1772683bcf..443bbe3aa2d162d470b5f625c28be14391464a49 100644 --- a/src/events/randomEvent.js +++ b/src/events/randomEvent.js @@ -17,6 +17,7 @@ App.Events.getIndividualEvents = function(slave) { new App.Events.RESSMoistPussy(), new App.Events.RESSWaistlineWoes(), new App.Events.RESSAssFitting(), + new App.Events.RECIButthole(), ] .filter(e => (e.eventPrerequisites().every(p => p()) && e.castActors(slave))) .reduce((res, cur) => res.concat(Array(cur.weight).fill(cur)), []); diff --git a/src/facilities/nursery/nursery.tw b/src/facilities/nursery/nursery.tw index 3b551e2bdfdfd8b4b678a6c9d374c53c4cf4c81a..86e754f2f8c30e6c56794f2fc1d3c93e2cbf5820 100644 --- a/src/facilities/nursery/nursery.tw +++ b/src/facilities/nursery/nursery.tw @@ -8,7 +8,7 @@ <<set $nurseryNameCaps = $nurseryName.replace("the ", "The ")>> <</if>> -<<set $readyChildren = 0, $nurseryBabies = $cribs.length, _freecribs = $nursery - $nurseryBabies, _NL = App.Entity.facilities.nursery.employeesIDs().size, _SL = $slaves.length, _eligibility = 0, $reservedChildren = FetusGlobalReserveCount("incubator"), $reservedChildrenNursery = FetusGlobalReserveCount("nursery")>> +<<set $nurseryBabies = $cribs.length, _freecribs = $nursery - $nurseryBabies, _NL = App.Entity.facilities.nursery.employeesIDs().size, _SL = $slaves.length, _eligibility = 0, $reservedChildren = FetusGlobalReserveCount("incubator"), $reservedChildrenNursery = FetusGlobalReserveCount("nursery")>> <p class="scene-intro"> $nurseryNameCaps <<switch $nurseryDecoration>> @@ -394,24 +394,6 @@ <br> <<includeDOM App.Facilities.Nursery.childList()>> - - /* - FIXME: not sure if this works - <<set $newSlavePool = []>> - <<for _nur = 0; _nur < $cribs.length; _nur++>> - <<if $cribs[_nur].growTime <= 0>> - <<set $nurseryOldID = $cribs[_nur].ID>> /* single slave case *//* - <<set _tempObject = {object: $cribs[_nur], ID: $cribs[_nur].ID}>> - <<set $newSlavePool.push(clone(_tempObject))>> - <<run $cribs.splice(_nur, 1)>> - <<set _nur-->> - <</if>> - <</for>> - <<if $newSlavePool.length == 1>> - <<set $readySlave = $newSlavePool[0].object>> - <<set $newSlavePool = 0>> - <</if>> - */ </div> </div> diff --git a/src/facilities/nursery/nurseryDatatypeCleanup.js b/src/facilities/nursery/nurseryDatatypeCleanup.js index 682238b05facf044ee8952150c23cbcdba730980..e2c0621bf5f2ad3f25a1ff826f1e50b7a77c6342 100644 --- a/src/facilities/nursery/nurseryDatatypeCleanup.js +++ b/src/facilities/nursery/nurseryDatatypeCleanup.js @@ -449,9 +449,7 @@ App.Facilities.Nursery.ChildDatatypeCleanup = function(child) { child.counter.births = Math.max(+child.counter.births, 0) || 0; child.counter.birthsTotal = Math.max(+child.counter.birthsTotal, 0) || child.counter.births; child.counter.laborCount = Math.max(+child.counter.laborCount, 0) || child.counter.birthsTotal; - child.childsFathered = Math.max(+child.childsFathered, 0) || 0; child.counter.PCChildrenFathered = Math.max(+child.counter.PCChildrenFathered, 0) || 0; - child.childsKnockedUp = Math.max(+child.childsKnockedUp, 0) || 0; child.counter.PCKnockedUp = Math.max(+child.counter.PCKnockedUp, 0) || 0; child.bodySwap = Math.max(+child.bodySwap, 0) || 0; } diff --git a/src/facilities/nursery/widgets/children/ChildState.js b/src/facilities/nursery/widgets/children/ChildState.js index 8b787dd89806b31e7088844d26d8ec40704c51a5..8de31f2d3e8fb185dbe124bb6123328325e7dd3b 100644 --- a/src/facilities/nursery/widgets/children/ChildState.js +++ b/src/facilities/nursery/widgets/children/ChildState.js @@ -1568,6 +1568,8 @@ App.Facilities.Nursery.ChildState = class ChildState { /** Slave can only ever birth girls */ girlsOnly: 0 }; + /** chance of generating sperm with a Y chromosome (yields male baby). inherited by sons, with mutation */ + this.spermY = 50; /** Counts various acts slave participated in */ this.counter = new App.Entity.ChildActionsCountersState(); /** Values provided by players */ diff --git a/src/facilities/nursery/widgets/children/longChildDescription.js b/src/facilities/nursery/widgets/children/longChildDescription.js index 78e5d86fc110e2ef4fee1c27e292aada45e3b150..c4aa78761a622c029132e842c450a625e3437158 100644 --- a/src/facilities/nursery/widgets/children/longChildDescription.js +++ b/src/facilities/nursery/widgets/children/longChildDescription.js @@ -19,9 +19,7 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event r = ``; const - { - he, him, his, hers, himself, boy, He, His - } = getPronouns(child); + { he, him, his, hers, himself, boy, He, His } = getPronouns(child); // helper functions function accent(child) { @@ -4372,7 +4370,7 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event } } } else if (V.seeRace) { - r += `Ethnically, ${he}'s <span class=tan>${child.race},</span> and ${his} skin is ${child.skin}${child.markings === "freckles" ? ` and lightly freckled${skinToneLevel(child.skin) > 5 && skinToneLevel(child.skin < 10) && child.hColor === "red" ? `, an attractive combination` : ``}` : child.markings === "heavily freckled" ? `and heavily freckled${skinToneLevel(child.skin > 5) && skinToneLevel(child.skin) < 10 && child.hColor === "red" ? `, an attractive combination` : ``}. ` : `. `}`; + r += `Ethnically, ${he}'s <span class="tan">${child.race},</span> and ${his} skin is ${child.skin}${child.markings === "freckles" ? ` and lightly freckled${skinToneLevel(child.skin) > 5 && skinToneLevel(child.skin < 10) && child.hColor === "red" ? `, an attractive combination` : ``}` : child.markings === "heavily freckled" ? `and heavily freckled${skinToneLevel(child.skin > 5) && skinToneLevel(child.skin) < 10 && child.hColor === "red" ? `, an attractive combination` : ``}. ` : `. `}`; r += `${child.skin === "sun tanned" || child.skin === "spray tanned" ? `${His} skin has been tanned ${child.skin === "sun tanned" ? `to a natural, healthy-looking tone` : `with obvious, garish-looking makeup`}. ` : ``}`; @@ -7282,13 +7280,13 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event r += `${He} is somewhat entertaining. `; } } else if (child.skill.entertainment <= 30) { - r += `${He} is <span class=aquamarine>reasonably entertaining.</span> `; + r += `${He} is <span class="aquamarine">reasonably entertaining.</span> `; } else if (child.skill.entertainment <= 60) { - r += `${He} is a <span class=aquamarine>skilled entertainer.</span> `; + r += `${He} is a <span class="aquamarine">skilled entertainer.</span> `; } else if (child.skill.entertainment < 100) { - r += `${He} is an <span class=aquamarine>expert entertainer.</span> `; + r += `${He} is an <span class="aquamarine">expert entertainer.</span> `; } else { - r += `${He} is a <span class=aquamarine>master of entertainment.</span> `; + r += `${He} is a <span class="aquamarine">master of entertainment.</span> `; } } else { if (child.skill.entertainment <= 10) { @@ -7298,13 +7296,13 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event r += `${He} is somewhat entertaining and `; } } else if (child.skill.entertainment <= 30) { - r += `${He} is <span class=aquamarine>reasonably entertaining</span> and `; + r += `${He} is <span class="aquamarine">reasonably entertaining</span> and `; } else if (child.skill.entertainment <= 60) { - r += `${He} is a <span class=aquamarine>skilled entertainer</span> and `; + r += `${He} is a <span class="aquamarine">skilled entertainer</span> and `; } else if (child.skill.entertainment < 100) { - r += `${He} is an <span class=aquamarine>expert entertainer</span> and `; + r += `${He} is an <span class="aquamarine">expert entertainer</span> and `; } else { - r += `${He} is a <span class=aquamarine>master of entertainment</span> and `; + r += `${He} is a <span class="aquamarine">master of entertainment</span> and `; } } if (child.skill.whoring <= 10) { @@ -7317,22 +7315,22 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event if (child.skill.entertainment <= 10) { r += `${He} `; } - r += `has <span class=aquamarine>basic experience as a prostitute.</span> `; + r += `has <span class="aquamarine">basic experience as a prostitute.</span> `; } else if (child.skill.whoring <= 60) { if (child.skill.entertainment <= 10) { r += `${He} is `; } - r += `a <span class=aquamarine>skilled streetwalker.</span> `; + r += `a <span class="aquamarine">skilled streetwalker.</span> `; } else if (child.skill.whoring < 100) { if (child.skill.entertainment <= 10) { r += `${He} is `; } - r += `an <span class=aquamarine>expert working ${boy}.</span> `; + r += `an <span class="aquamarine">expert working ${boy}.</span> `; } else { if (child.skill.entertainment <= 10) { r += `${He} is `; } - r += `a <span class=aquamarine>masterful whore.</span> `; + r += `a <span class="aquamarine">masterful whore.</span> `; } if (child.custom.desc !== "" && jsDef(child.custom.desc)) { diff --git a/src/facilities/nursery/widgets/infants/InfantState.js b/src/facilities/nursery/widgets/infants/InfantState.js index 87f0b6a7545f8a29c4dc1ad3ee40154e64d1dd5b..f50c3506b54d851f0bbd744d250c0b8ab9f8644b 100644 --- a/src/facilities/nursery/widgets/infants/InfantState.js +++ b/src/facilities/nursery/widgets/infants/InfantState.js @@ -183,6 +183,8 @@ App.Facilities.Nursery.InfantState = class InfantState { /** child can only ever birth girls */ girlsOnly: 0 }; + /** chance of generating sperm with a Y chromosome (yields male baby). inherited by sons, with mutation */ + this.spermY = 50; /** how many weeks until the child is ready for release */ this.growTime = 156; } diff --git a/src/facilities/nursery/widgets/reports/childrenReport.js b/src/facilities/nursery/widgets/reports/childrenReport.js index 83a407e7524028020a70233b323801f31e46d9a2..5dc0bf6c3f5ea815a138b2e52014f64e7ca4e9ee 100644 --- a/src/facilities/nursery/widgets/reports/childrenReport.js +++ b/src/facilities/nursery/widgets/reports/childrenReport.js @@ -13,31 +13,9 @@ App.Facilities.Nursery.childrenReport = function childrenReport() { let r = ``; - for (let i = 0; i < CL; i++) { + for (const child of V.cribs) { const - child = V.cribs[i]; - // { - // he, him, his, He, His - // } = getPronouns(child); - - let - he, - his, - him, - He, - His; - - // FIXME: get pronoun system to work with child objects - if (child.genes === "XX") { - he = "she", - him = "her", - his = "her"; - } else { - he = "he", - him = "him", - his = "his"; - } - He = capFirstChar(he), His = capFirstChar(his); + { he, his, He, His } = getPronouns(child); if (child.growTime > 0) { r += `<br><span class="pink">${child.slaveName}</span> is growing steadily. ${He} will be ready for release in about ${years(child.growTime)}. `; diff --git a/src/facilities/nursery/widgets/utils/nurseryUtils.js b/src/facilities/nursery/widgets/utils/nurseryUtils.js index ff7ac62484a8d10df6f24a6607fa821d2ef48a93..383717caf0b055d12c578705df109f08fd597260 100644 --- a/src/facilities/nursery/widgets/utils/nurseryUtils.js +++ b/src/facilities/nursery/widgets/utils/nurseryUtils.js @@ -137,8 +137,6 @@ App.Facilities.Nursery.infantToChild = function infantToChild(child) { child.chastityPenis = 0; child.chastityVagina = 0; child.chem = 0; - child.childsFathered = 0; - child.childsKnockedUp = 0; child.choosesOwnClothes = 0; child.clit = jsRandom(0, 2); child.clitPiercing = 0; @@ -206,28 +204,6 @@ App.Facilities.Nursery.infantToChild = function infantToChild(child) { NCS: 0, rapidCellGrowth: 0 }; - child.geneticQuirks = { - albinism: 0, - androgyny: 0, - dwarfism: 0, - fertility: 0, - gigantism: 0, - gigantomastia: 0, - heterochromia: 0, - hyperFertility: 0, - uterineHypersensitivity: 0, - mGain: 0, - mLoss: 0, - macromastia: 0, - pFace: 0, - rearLipedema: 0, - superfetation: 0, - uFace: 0, - wGain: 0, - wLoss: 0, - wellHung: 0 - }; - child.genetics = {}; child.hLength = jsRandom(30, 70); child.hStyle = "long"; child.haircuts = 0; diff --git a/src/gui/options/options.tw b/src/gui/options/options.tw index 46bd823470bfb6f6f3a1375c1257db830ed263f3..8cd9ef8151ef0e2c32b9737cd1363cc392548620 100644 --- a/src/gui/options/options.tw +++ b/src/gui/options/options.tw @@ -302,8 +302,8 @@ .addValue("Enabled", 1).on().addValue("Disabled", 0).off() .addComment("<<if $seeDicksAffectsPregnancy === 1>>Currently <<print $seeDicks>>% of children will be born male. <</if>>Will not affect existing pregnancies already in-game.")>> - <<if $seeDicksAffectsPregnancy > 0>> - <<run _options.addOption("XX slaves can have sons", "adamPrinciple") + <<if $seeDicksAffectsPregnancy === 0>> + <<run _options.addOption("XX slaves only father daughters", "adamPrinciple") .addValue("Enabled", 1).on().addValue("Disabled", 0).off() .addComment("Will not affect existing pregnancies already in-game.")>> <</if>> diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js index 256f75cfe106a1d317eaffefb47ea5afa2864634..9fc5ff67ab3722c2f1738de6ad54a36c95d0ef74 100644 --- a/src/interaction/main/walkPast.js +++ b/src/interaction/main/walkPast.js @@ -1,18 +1,11 @@ -/* eslint-disable no-unused-vars */ - globalThis.walkPast = (function() { - "use strict"; - - // core string variables let t; let r; let output; // selection variables - let flag; - let watchArray; - let watch; + let target; // rng variables let seed; @@ -25,29 +18,25 @@ globalThis.walkPast = (function() { // partnerSlave variables let partnerSlave; let partnerName; - let race2; - - // string shorteners - let fuckSpot; - let activeSlaveRel; - let partnerSlaveRel; - - /* eslint-enable no-unused-vars */ - - function walkPast(activeSlave, fixed) { + /** generate a walkPast vignette + * @param {App.Entity.SlaveState} activeSlave + * @param {string} [fixedTarget] - if set, force target to this value + * @returns {string} - vignette text (SC markup) + */ + function walkPast(activeSlave, fixedTarget) { output = ""; seed = jsRandom(1, 100); - watchArray = []; name = activeSlave.slaveName; - if (totalRelatives(activeSlave) > 0 && ((fixed && V.target === "FRelation") || (!fixed && jsRandom(1, 100) > 80))) { + let flag; + if (totalRelatives(activeSlave) > 0 && ((fixedTarget === "FRelation") || (!fixedTarget && jsRandom(1, 100) > 80))) { flag = 110; V.partner = "relation"; - } else if (activeSlave.relationship > 0 && ((fixed && V.target === "FRelation") || (!fixed && jsRandom(1, 100) > 70))) { + } else if (activeSlave.relationship > 0 && ((fixedTarget === "FRelation") || (!fixedTarget && jsRandom(1, 100) > 70))) { flag = 120; V.partner = "relationship"; - } else if (activeSlave.rivalry !== 0 && hasAllLimbs(activeSlave) && ((fixed && V.target === "FRelation") || (!fixed && jsRandom(1, 100) > 70))) { + } else if (activeSlave.rivalry !== 0 && hasAllLimbs(activeSlave) && ((fixedTarget === "FRival") || (!fixedTarget && jsRandom(1, 100) > 70))) { flag = 130; V.partner = "rivalry"; } else { @@ -56,7 +45,7 @@ globalThis.walkPast = (function() { } // return if we insist on a relation or rival but we didn't find one above - if (fixed && (["FRelation", "FRival"].includes(V.target) && !(V.partner))) { + if (["FRelation", "FRival"].includes(fixedTarget) && !(V.partner)) { return; } @@ -70,83 +59,60 @@ globalThis.walkPast = (function() { } else if (V.partner === "relationship" || V.partner === "relation") { output += relatedSlave(activeSlave); } else { - if (activeSlave.fuckdoll === 0) { - watchArray.push("boobWatch"); - } - if (activeSlave.belly < 150000) { - if (activeSlave.dick > 0 && (V.policies.sexualOpeness === 1 || activeSlave.toyHole === "dick")) { - watchArray.push("dickWatch"); - } - if (activeSlave.vagina >= 0) { - watchArray.push("vaginaWatch"); - } - } - if (activeSlave.belly >= 1500) { - watchArray.push("bellyWatch"); - } - if (activeSlave.chastityAnus === 0) { - watchArray.push("anusWatch"); - } - watchArray.push("buttWatch"); - watchArray.push("lipWatch"); - - if (fixed) { - switch (V.target) { - case "FLips": - output += lipWatch(activeSlave); - break; - case "FBoobs": - output += boobWatch(activeSlave); - break; - case "FButt": - output += buttWatch(activeSlave); - break; - case "FAnus": - output += anusWatch(activeSlave); - break; - case "FVagina": - if (activeSlave.belly < 150000) { - if (activeSlave.vagina >= 0) { - output += `<br><span class="note">Vagina scene available:</span> ${vaginaWatch(activeSlave)}`; - } + switch (fixedTarget) { + case "FLips": + output += lipWatch(activeSlave); + break; + case "FBoobs": + output += boobWatch(activeSlave); + break; + case "FButt": + output += buttWatch(activeSlave); + break; + case "FAnus": + output += anusWatch(activeSlave); + break; + case "FVagina": + if (activeSlave.belly < 150000) { + if (activeSlave.vagina >= 0) { + output += `<br><span class="note">Vagina scene available:</span> ${vaginaWatch(activeSlave)}`; } - if (activeSlave.belly >= 1500) { - output += `<br><span class="note">Belly scene available:</span> ${bellyWatch(activeSlave)}`; + } + if (activeSlave.belly >= 1500) { + output += `<br><span class="note">Belly scene available:</span> ${bellyWatch(activeSlave)}`; + } + break; + case "FDick": + if (activeSlave.belly < 150000) { + if (activeSlave.dick > 0 && (V.policies.sexualOpeness === 1 || activeSlave.toyHole === "dick")) { + output += dickWatch(activeSlave); + } else { + return; } - break; - case "FDick": - if (activeSlave.belly < 150000) { - if (activeSlave.dick > 0 && (V.policies.sexualOpeness === 1 || activeSlave.toyHole === "dick")) { - output += dickWatch(activeSlave); - } else { - return; - } + } + break; + default: { // invalid or unspecified fixed target + let watchArray = []; + if (activeSlave.fuckdoll === 0) { + watchArray.push(boobWatch); + } + if (activeSlave.belly < 150000) { + if (activeSlave.dick > 0 && (V.policies.sexualOpeness === 1 || activeSlave.toyHole === "dick")) { + watchArray.push(dickWatch); } - break; - case "FRival": - output += boobWatch(activeSlave); - break; - case "FRelation": - output += lipWatch(activeSlave); - break; - } - } else { - watch = jsEither(watchArray); - - if (watch === "boobWatch") { - output += boobWatch(activeSlave); - } else if (watch === "dickWatch") { - output += dickWatch(activeSlave); - } else if (watch === "vaginaWatch") { - output += vaginaWatch(activeSlave); - } else if (watch === "bellyWatch") { - output += bellyWatch(activeSlave); - } else if (watch === "anusWatch") { - output += anusWatch(activeSlave); - } else if (watch === "buttWatch") { - output += buttWatch(activeSlave); - } else if (watch === "lipWatch") { - output += lipWatch(activeSlave); + if (activeSlave.vagina >= 0) { + watchArray.push(vaginaWatch); + } + } + if (activeSlave.belly >= 1500) { + watchArray.push(bellyWatch); + } + if (activeSlave.chastityAnus === 0) { + watchArray.push(anusWatch); + } + watchArray.push(buttWatch); + watchArray.push(lipWatch); + output += jsEither(watchArray)(activeSlave); } } } @@ -156,27 +122,27 @@ globalThis.walkPast = (function() { } = getPronouns(activeSlave); if (activeSlave.fuckdoll === 0) { - if (watch === "buttWatch" && activeSlave.chastityAnus) { + if (target === "FButt" && activeSlave.chastityAnus) { output += ` If you wish to have anal intercourse with ${him} you must order ${him} to remove ${his} chastity belt.`; - output += ` <span id="walkpast"><<link "Grope ${his} rear instead">><<replace "#walk">><<include $target>><</replace>><</link>></span>`; - } else if (watch === "vaginaWatch" && activeSlave.chastityVagina) { + output += ` <span id="walkpast"><<link "Grope ${his} rear instead">><<replace "#walk">><<include "FondleButt">><</replace>><</link>></span>`; + } else if (target === "FVagina" && activeSlave.chastityVagina) { output += ` If you wish to have vanilla intercourse with ${him} you must order ${him} to remove ${his} chastity belt.`; } else if (flag > 100) { const setter = (flag === 110) ? `<<set $partner="${V.partner}", $relation=${V.relation}>>` : `<<set $partner="${V.partner}">>`; - output += ` <span id="walkpast"><<link "Summon them both">>${setter}<<replace "#walk">><<include $target>><</replace>><</link>></span>`; + output += ` <span id="walkpast"><<link "Summon them both">>${setter}<<replace "#walk">><<include "${target}">><</replace>><</link>></span>`; } else if (activeSlave.assignment === Job.CONFINEMENT) { - output += ` <span id="walkpast"><<link "Have ${him} brought out of ${his} cell">><<replace "#walk">><<include $target>><</replace>><</link>></span>`; + output += ` <span id="walkpast"><<link "Have ${him} brought out of ${his} cell">><<replace "#walk">><<include "${target}">><</replace>><</link>></span>`; } else if (activeSlave.assignment === Job.DAIRY && V.dairyRestraintsSetting > 1) { output += ` ${He} is strapped into a milking machine and cannot leave ${V.dairyName}.`; } else { if ([Job.ARCADE, Job.CELLBLOCK, Job.ATTENDANT, Job.DJ, Job.MADAM, Job.MILKMAID, Job.TEACHER, Job.STEWARD, Job.WARDEN, Job.AGENT, Job.CONCUBINE, Job.AGENTPARTNER, Job.HEADGIRLSUITE, Job.CLUB, Job.MASTERSUITE, Job.CONFINEMENT, Job.GLORYHOLE, Job.QUARTER, Job.BROTHEL, Job.DAIRY].includes(activeSlave.assignment)) { - output += ` <span id="walkpast"><<link "Have ${him} take a break and come up">><<replace "#walk">><<include $target>><</replace>><</link>></span>`; + output += ` <span id="walkpast"><<link "Have ${him} take a break and come up">><<replace "#walk">><<include "${target}">><</replace>><</link>></span>`; } else { - output += ` <span id="walkpast"><<link "Call ${him} over">><<replace "#walk">><<include $target>><</replace>><</link>></span>`; + output += ` <span id="walkpast"><<link "Call ${him} over">><<replace "#walk">><<include "${target}">><</replace>><</link>></span>`; } } } else { - switch (V.target) { + switch (target) { case "FVagina": output += ` <span id="walkpast"><<link "Fuck ${him}">><<replace "#walk">><<include "FFuckdollVaginal">><</replace>><</link>></span>`; break; @@ -224,7 +190,7 @@ globalThis.walkPast = (function() { } r += walkPasts(partnerSlave, 100-seed); - V.target = "FRival"; + target = "FRival"; } return r + ` `; @@ -249,22 +215,9 @@ globalThis.walkPast = (function() { } = getPronouns(partnerSlave).appendSuffix("2"); /* /* eslint-enable no-unused-vars */ partnerName = partnerSlave.slaveName; - race2 = (V.seeRace ? partnerSlave.race : ""); - if (activeSlave.relationship <= 3) { - activeSlaveRel = "friend with benefits"; - } else if (activeSlave.relationship <= 4) { - activeSlaveRel = "lover"; - } else { - activeSlaveRel = `slave ${wife}`; - } - let partnerSlaveRel; - if (activeSlave.relationship <= 3) { - partnerSlaveRel = "friend with benefits"; - } else if (activeSlave.relationship <= 4) { - partnerSlaveRel = "lover"; - } else { - partnerSlaveRel = `slave ${wife2}`; - } + const race2 = (V.seeRace ? partnerSlave.race : ""); + const activeSlaveRel = relationshipTerm(activeSlave); + const partnerSlaveRel = relationshipTerm(partnerSlave); t += `${name} and ${partnerName} are `; if (!isSlaveAvailable(partnerSlave)) { @@ -279,6 +232,7 @@ globalThis.walkPast = (function() { t += `trying their best to maintain their relationship with ${partnerName} being nothing more than a hole in ${V.arcadeName}.`; } } else if (seed >= 66) { /* SEXY TIMES */ + let fuckSpot; if (partnerSlave.ID === V.HeadGirl.ID && V.HGSuite === 1) { fuckSpot = `in ${partnerName}'s suite`; } else if (activeSlave.rules.living === "luxurious") { @@ -652,7 +606,7 @@ globalThis.walkPast = (function() { t += `${name} is deepthroating ${partnerName} as ${he2} struggles to breath.`; } else if (canDoVaginal(activeSlave) && fuckSeed > 30) { if (canPenetrate(partnerSlave) && activeSlave.vagina !== 0) { - if (fuckSeed > 45 && hasBothArms(_partnerSlave)) { + if (fuckSeed > 45 && hasBothArms(partnerSlave)) { t += `${name} is forcing ${partnerName} to hold ${him} aloft as ${he} enjoys a good vaginal pounding from an unwilling partner.`; } else if (fuckSeed > 40 && hasAnyArms(activeSlave) && !isAmputee(partnerSlave)) { t += `${name} has ${partnerName} pinned against the wall and is taking ${his2} dick in ${his} pussy by force.`; @@ -1425,7 +1379,7 @@ globalThis.walkPast = (function() { } /* CLOSE SEXY/CUDDLE/TOGETHER TIME */ - V.target = "FRelation"; + target = "FRelation"; } else { t += ` Lover not found!`; } @@ -1446,21 +1400,20 @@ globalThis.walkPast = (function() { partnerSlave = randomRelatedSlave(activeSlave); V.relation = partnerSlave.ID; } else { - activeSlaveRel = relationshipTerm(activeSlave); partnerSlave = getSlave(activeSlave.relationshipTarget); } if (partnerSlave !== undefined) { /* potential problem point */ r += ` ${His} `; if (V.partner === "relation") { - r += `${relativeTerm(V.activeSlave, partnerSlave)} `; + r += `${relativeTerm(activeSlave, partnerSlave)} `; } else { - r += `${activeSlaveRel} `; + r += `${relationshipTerm(activeSlave)} `; } r += `${partnerSlave.slaveName} `; r += walkPasts(partnerSlave, fuckSeed); - V.target = "FRelation"; /* potentially removed later */ + target = "FRelation"; /* potentially removed later */ } else { r += ` Expected partner not found!`; } @@ -2072,7 +2025,7 @@ globalThis.walkPast = (function() { He, His } = pronouns; - V.target = "FBoobs"; + target = "FBoobs"; const breasts = (slave.boobs < 300) ? `flat chest` : `breasts`; @@ -2503,7 +2456,7 @@ globalThis.walkPast = (function() { He, His } = getPronouns(slave); - V.target = "FButt"; + target = "FButt"; t += App.Desc.butt(slave); t += ` `; @@ -2836,9 +2789,6 @@ globalThis.walkPast = (function() { t += `You run your eye over ${his} naked hips.`; } } - if (slave.chastityAnus) { - V.target = "FondleButt"; - } return t; } @@ -2849,7 +2799,7 @@ globalThis.walkPast = (function() { He, His } = getPronouns(slave); - V.target = "FVagina"; + target = "FVagina"; // Desc belly if large enough if (slave.inflation === 0) { @@ -7682,7 +7632,7 @@ globalThis.walkPast = (function() { He, His } = getPronouns(slave); - V.target = "FVagina"; + target = "FVagina"; // Desc dick and vag t += App.Desc.crotch(slave); t += ` `; @@ -7695,7 +7645,7 @@ globalThis.walkPast = (function() { case "uncomfortable straps": if ((slave.dick !== 0) && (slave.vagina !== -1)) { t += `A strap passes `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between ${his} legs, `; } else { t += `along ${his} perineum, `; @@ -7703,7 +7653,7 @@ globalThis.walkPast = (function() { t += `and the big ring over ${his} hermaphroditic genitalia gleams from between them.`; } else if (slave.dick !== 0) { t += `A strap passes `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between ${his} legs, `; } else { t += `along ${his} perineum, `; @@ -7711,7 +7661,7 @@ globalThis.walkPast = (function() { t += `and the ring around the base of ${his} cock gleams from between them.`; } else { t += `A strap passes `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between ${his} legs, `; } else { t += `along ${his} perineum, `; @@ -7721,7 +7671,7 @@ globalThis.walkPast = (function() { break; case "shibari ropes": t += `${His} ropes run tightly `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between ${his} legs, `; } else { t += `along ${his} perineum, `; @@ -7954,7 +7904,7 @@ globalThis.walkPast = (function() { case "a cheerleader outfit": if (slave.dick !== 0) { t += `As ${he} moves, ${his} short pleated cheerleader skirt is bounced forward by something `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between ${his} legs.`; } else { t += `at ${his} crotch.`; @@ -7984,7 +7934,7 @@ globalThis.walkPast = (function() { case "a slutty outfit": if ((slave.dick !== 0) && (slave.vagina !== -1)) { t += `For today's slutty outfit ${he}'s chosen ripped jean shorts whose holes tantalizingly hint that ${he}'s very unusual `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between the legs.`; } else { t += `down there.`; @@ -7993,7 +7943,7 @@ globalThis.walkPast = (function() { t += `For today's slutty outfit ${he}'s chosen ripped jean shorts so brief that ${his} huge dick occasionally escapes and flops free.`; } else if (slave.dick !== 0) { t += `For today's slutty outfit ${he}'s chosen ripped jean shorts whose holes tantalizingly hint that ${he}'s got something other than a pussy `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between the legs.`; } else { t += `down there.`; @@ -8253,7 +8203,7 @@ globalThis.walkPast = (function() { He, His } = getPronouns(slave); - V.target = "FDick"; + target = "FDick"; // Desc dick and vag t += App.Desc.crotch(slave); t += ` `; @@ -8266,7 +8216,7 @@ globalThis.walkPast = (function() { case "uncomfortable straps": if ((slave.dick !== 0) && (slave.vagina !== -1)) { t += `A strap passes `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between ${his} legs, `; } else { t += `along ${his} perineum, `; @@ -8274,7 +8224,7 @@ globalThis.walkPast = (function() { t += `and the big ring over ${his} hermaphroditic genitalia gleams from between them.`; } else if (slave.dick !== 0) { t += `A strap passes `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between ${his} legs, `; } else { t += `along ${his} perineum, `; @@ -8282,7 +8232,7 @@ globalThis.walkPast = (function() { t += `and the ring around the base of ${his} cock gleams from between them.`; } else { t += `A strap passes `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between ${his} legs, `; } else { t += `along ${his} perineum, `; @@ -8292,7 +8242,7 @@ globalThis.walkPast = (function() { break; case "shibari ropes": t += `${His} ropes run tightly `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between ${his} legs, `; } else { t += `along ${his} perineum, `; @@ -8525,7 +8475,7 @@ globalThis.walkPast = (function() { case "a cheerleader outfit": if (slave.dick !== 0) { t += `As ${he} moves, ${his} short pleated cheerleader skirt is bounced forward by something `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between ${his} legs.`; } else { t += `at ${his} crotch.`; @@ -8555,7 +8505,7 @@ globalThis.walkPast = (function() { case "a slutty outfit": if ((slave.dick !== 0) && (slave.vagina !== -1)) { t += `For today's slutty outfit ${he}'s chosen ripped jean shorts whose holes tantalizingly hint that ${he}'s very unusual `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between the legs.`; } else { t += `down there.`; @@ -8564,7 +8514,7 @@ globalThis.walkPast = (function() { t += `For today's slutty outfit ${he}'s chosen ripped jean shorts so brief that ${his} huge dick occasionally escapes and flops free.`; } else if (slave.dick !== 0) { t += `For today's slutty outfit ${he}'s chosen ripped jean shorts whose holes tantalizingly hint that ${he}'s got something other than a pussy `; - if (hasBothLegs(V.activeSlave)) { + if (hasBothLegs(slave)) { t += `between the legs.`; } else { t += `down there.`; @@ -8824,7 +8774,7 @@ globalThis.walkPast = (function() { He, His } = getPronouns(slave); - V.target = "FAnus"; + target = "FAnus"; t += App.Desc.anus(slave); if (slave.chastityAnus === 0) { @@ -9228,9 +9178,9 @@ globalThis.walkPast = (function() { } if (jsRandom(1, 3) === 1) { - V.target = "FKiss"; + target = "FKiss"; } else { - V.target = "FLips"; + target = "FLips"; } return t; @@ -9238,3 +9188,14 @@ globalThis.walkPast = (function() { return walkPast; })(); + +/** generate the specified walkPast vignette for all slaves (for debugging purposes) + * @param {string} fixedTarget + * @returns {string} + */ +globalThis.walkPastAll = function(fixedTarget) { + return V.slaves.map((s) => { + const wp = walkPast(s, fixedTarget); + return wp ? `<p>${wp}</p>` : ``; + }).join(''); +}; diff --git a/src/interaction/slaveInteract.js b/src/interaction/slaveInteract.js index 0d22fd7261227b5a00232d782cefe5d0f578c0a6..a4e7be72cf7704ffae9a533656f4d437e401f3ca 100644 --- a/src/interaction/slaveInteract.js +++ b/src/interaction/slaveInteract.js @@ -802,7 +802,7 @@ App.UI.SlaveInteract.diet = function(slave) { if (slave.balls > 0 && V.cumProDiet === 1) { production.push({text: `Cum production`, updateSlave: {diet: "cum production"}}); } - if (isFertile(slave) && slave.preg === 0 && V.dietFertility === 1) { + if (((isFertile(slave) && slave.preg === 0) || (slave.geneticQuirks.superfetation === 2 && canGetPregnant(slave) && V.geneticMappingUpgrade !== 0)) && V.dietFertility === 1) { production.push({text: `Fertility`, updateSlave: {diet: "fertility"}}); } @@ -2759,7 +2759,7 @@ App.UI.SlaveInteract.custom = (function() { el.append(`Change ${his} custom description: `); el.appendChild(App.UI.DOM.makeTextBox( - slave.custom.desc, + pronounsForSlaveProp(slave, slave.custom.desc), v => { slave.custom.desc = v; App.UI.SlaveInteract.custom(slave); diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js index cd6e9f7e093f671f91531c3a615866e948593623..861d83d377ff43c9abf07ddc4d492a76b27fa10f 100644 --- a/src/js/SlaveState.js +++ b/src/js/SlaveState.js @@ -2124,6 +2124,8 @@ App.Entity.SlaveState = class SlaveState { /** slave can only ever birth girls */ girlsOnly: 0 }; + /** chance of generating sperm with a Y chromosome (yields male baby). inherited by sons, with mutation */ + this.spermY = 50; /** Counts various acts slave participated in */ this.counter = new App.Entity.SlaveActionsCountersState(); /** Values provided by players */ diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js index 8c18f1bc8ee9a5fbb036407101b42c135e6e4625..1b0f22bf1a10f39725187f6514ba9e17462a9b1a 100644 --- a/src/js/eventSelectionJS.js +++ b/src/js/eventSelectionJS.js @@ -386,20 +386,6 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) { } } - if (eventSlave.anus > 1) { - if (eventSlave.anus < 4) { - if (eventSlave.analArea > 1) { - if (eventSlave.devotion > 50) { - if (eventSlave.trust > 50) { - if (V.REButtholeCheckinIDs.includes(eventSlave.ID)) { - V.RECIevent.push("butthole"); - } - } - } - } - } - } - /* if(eventSlave.drugs === "breast injections") { if(eventSlave.anus > 0 || eventSlave.vagina > 0) { diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js index e251391818d33a8b0171d49f6fa34126c989770a..e3f6bddc01391f0448023be54fba8ce9cc319bf8 100644 --- a/src/js/statsChecker/statsChecker.js +++ b/src/js/statsChecker/statsChecker.js @@ -298,7 +298,7 @@ globalThis.genderLawPass = function(slave) { genderLawPass = 0; } if (arcology.FSAssetExpansionist !== "unset") { - if (slave.boobs < 500 || slave.boobs > 1600 || slave.butt < 3 || slave.butt > 6) { + if (slave.boobs < 1600 || slave.boobs > 4300 || slave.butt < 4 || slave.butt > 8) { genderLawPass = 0; } } else if (slave.boobs < 500 || slave.boobs > 800 || slave.butt < 3 || slave.butt > 4) { diff --git a/src/npc/descriptions/belly/belly.js b/src/npc/descriptions/belly/belly.js index 84df3441bddbab8ea6867bcd0331bf8ec62c150a..fef3aafa62a987340180c691e48864cc096582ca 100644 --- a/src/npc/descriptions/belly/belly.js +++ b/src/npc/descriptions/belly/belly.js @@ -12392,6 +12392,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) { } function marksAndMods() { + const r = []; if (slave.fuckdoll === 0) { if (setup.fakeBellies.includes(slave.bellyAccessory)) { switch (slave.bellyAccessory) { diff --git a/src/npc/descriptions/descriptionWidgets.js b/src/npc/descriptions/descriptionWidgets.js index b9f5035a7c033ff5e749065d362e585912f14369..fb2d4a310b6ef56166ec7838e8ffa192a1b4f84b 100644 --- a/src/npc/descriptions/descriptionWidgets.js +++ b/src/npc/descriptions/descriptionWidgets.js @@ -1536,6 +1536,9 @@ App.Desc.geneticQuirkAssessment = function(slave) { if (slave.geneticQuirks.mLoss === 1 && V.geneticMappingUpgrade >= 2) { r.push(`${He} is a myotonic dystrophy carrier.`); } + if (slave.genes === "XY" && !V.seeDicksAffectsPregnancy) { + r.push(`Analysis of ${his} sperm shows that ${he} has a ${slave.spermY}% chance of fathering a son.`); + } } return r.join(` `); }; diff --git a/src/npc/descriptions/longSlave.js b/src/npc/descriptions/longSlave.js index 1df0cb307f5c2d93b2472534bf43aba678bbabd4..d011fd180665eb9706f908d7bcf211302705b0da 100644 --- a/src/npc/descriptions/longSlave.js +++ b/src/npc/descriptions/longSlave.js @@ -268,7 +268,7 @@ App.Desc.longSlave = function(slave = V.activeSlave, {market = 0, eventDescripti r.push(App.Desc.skills(slave)); if (slave.custom.desc !== "" && slave.custom.desc) { - r.push(slave.custom.desc); + r.push(pronounsForSlaveProp(slave, slave.custom.desc)); } if (V.arcologies[0].FSGenderFundamentalistLawBeauty + V.arcologies[0].FSGenderRadicalistLawBeauty > 0) { diff --git a/src/npc/generate/generateGenetics.js b/src/npc/generate/generateGenetics.js index ff7dd2751c6dafa8a83ef8b1e36b3b283e29cf02..250afa87426477062e046f46b602395e402c13e3 100644 --- a/src/npc/generate/generateGenetics.js +++ b/src/npc/generate/generateGenetics.js @@ -44,7 +44,8 @@ globalThis.generateGenetics = (function() { clone: 0, cloneID: 0, geneticQuirks: {}, - fetish: "none" + fetish: "none", + spermY: 50 }; if (actor1.ID > 0) { mother = V.genePool.find(s => s.ID === actor1.ID); @@ -114,10 +115,28 @@ globalThis.generateGenetics = (function() { genes.sexualFlaw = setSexualFlaw(father, mother); genes.behavioralFlaw = setBehavioralFlaw(father, mother); genes.fetish = setFetish(father, mother); + genes.spermY = setSpermY(father, mother); return genes; } + // get spermY value of the parent that's donating the Y chromosome + function getSpermY(father, mother) { + let sourceSpermY = 50; // default if no inherited Y chromosome (should be impossible, but the Adam Principle is optional, so it can happen) + if (father !== 0 && father.genes === "XY") { + sourceSpermY = father.spermY; + } else if (mother.genes === "XY") { + sourceSpermY = father.spermY; + } + return sourceSpermY; + } + + // generation chance of y-chormosome carrying sperm + function setSpermY(father, mother) { + // Y-linked trait, so figure out where the Y chromosome is coming from and start from there + return normalRandInt(getSpermY(father, mother), 5); // mutation + } + // gender function setGender(father, mother) { let gender; @@ -128,17 +147,26 @@ globalThis.generateGenetics = (function() { } else if (V.adamPrinciple === 1) { if (father !== 0) { if (father.genes === "XX" && mother.genes === "XX") { - gender = "XX"; + gender = "XX"; // neither parent has a Y chromosome, it's definitely a girl } else if (father.genes !== mother.genes) { - gender = jsEither(["XX", "XY"]); + gender = jsRandom(0, 99) < getSpermY(father, mother) ? "XY" : "XX"; // "normal" conception } else { - gender = jsEither(["XX", "XY", "XY", "YY"]); + // both parents have a Y chromosome that they could donate; treat them as independent events + const motherY = jsRandom(0, 99) < mother.spermY; + const fatherY = jsRandom(0, 99) < father.spermY; + if (motherY && fatherY) { + gender = "YY"; // inviable, but retain for now + } else if (!motherY && !fatherY) { + gender = "XX"; // it's a girl! + } else { + gender = "XY"; // it's a boy! + } } } else { - gender = jsEither(["XX", "XY"]); + gender = jsRandom(0, 99) < getSpermY(father, mother) ? "XY" : "XX"; } } else { - gender = jsEither(["XX", "XY"]); + gender = jsRandom(0, 99) < getSpermY(father, mother) ? "XY" : "XX"; } return gender; } @@ -1156,6 +1184,7 @@ globalThis.generateChild = function (mother, ovum, incubator=false) { child.origHColor = genes.hColor; child.skin = getGeneticSkinColor(child); child.hColor = getGeneticHairColor(child); + child.spermY = genes.spermY; child.pubicHColor = child.hColor; child.underArmHColor = child.hColor; child.eyebrowHColor = child.hColor; @@ -1209,6 +1238,7 @@ globalThis.generateChild = function (mother, ovum, incubator=false) { child.origHColor = genes.hColor; child.skin = getGeneticSkinColor(child); child.hColor = getGeneticHairColor(child); + child.spermY = genes.spermY; resetEyeColor(child, "both"); child.pubicHColor = child.hColor; child.underArmHColor = child.hColor; diff --git a/src/npc/generate/generateNewSlaveJS.js b/src/npc/generate/generateNewSlaveJS.js index 61b02bfe1717a7cdc5dce32b3aee1588e7911d77..b3c83d8531c21bc43f4a868ef00f951db0d11dd4 100644 --- a/src/npc/generate/generateNewSlaveJS.js +++ b/src/npc/generate/generateNewSlaveJS.js @@ -103,6 +103,7 @@ globalThis.GenerateNewSlave = (function() { slave.hColor = getGeneticHairColor(slave); slave.skin = getGeneticSkinColor(slave); resetEyeColor(slave, "both"); + slave.spermY = normalRandInt(50, 5); } function GenerateXXSlave() { diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js index 115a70c6f1b6ae32d518a055d72e76447d3dc0ec..4efbdaf320adf2e8d164496d3c6f4216be6eab5f 100644 --- a/src/player/js/PlayerState.js +++ b/src/player/js/PlayerState.js @@ -1691,6 +1691,8 @@ App.Entity.PlayerState = class PlayerState { /** slave can only ever birth girls */ girlsOnly: 0 }; + /** chance of generating sperm with a Y chromosome (yields male baby). inherited by sons, with mutation */ + this.spermY = 50; /** Counts various thing you have done in */ this.counter = new App.Entity.PlayerActionsCountersState(); /** Values provided by players */ diff --git a/src/pregmod/analyzePregnancy.tw b/src/pregmod/analyzePregnancy.tw index 6834f35f95aa9b6991ca0b1360e7ec6d70bf473b..4a64fa0b204d7bd692498668bd32186fe943dc0b 100644 --- a/src/pregmod/analyzePregnancy.tw +++ b/src/pregmod/analyzePregnancy.tw @@ -14,7 +14,7 @@ <<= getSlave($activeSlave.ID).slaveName>> is <<if getSlave($activeSlave.ID).devotion < 20>>restrained<<else>>comfortably reclined<</if>> with $his stomach prepped for examination. $He shudders slightly at the cold touch of the sensor against $his skin. </p> -<<= App.Desc.pregnancy($activeSlave, {market: "generic"})>> +<<= App.Desc.pregnancy($activeSlave)>> <p> <h2>Overall statistics</h2> @@ -372,12 +372,16 @@ </p> <</for>> </p> +<<elseif getSlave($activeSlave.ID).preg == -3>> /*special states*/ + Failure to locate any ova. Subject is infertile. <<elseif getSlave($activeSlave.ID).pregWeek < 0>> /*special states*/ Subject is in the postpartem period. +<<elseif getSlave($activeSlave.ID).ovaryAge >= 47 >> + $His infertility is due to menopausal ovaries. +<<elseif getSlave($activeSlave.ID).ovaries === 0 && getSlave($activeSlave.ID).mpreg === 0>> + $His infertility is due to missing ovaries. +<<elseif getSlave($activeSlave.ID).preg == -2>> /*special states*/ + $His infertility is due to sterilization; $his ovaries could still work. <<elseif getSlave($activeSlave.ID).preg == -1>> /*special states*/ Contreceptive agents detected in subject. -<<elseif getSlave($activeSlave.ID).preg == -2>> /*special states*/ - Subject is infertile. -<<elseif getSlave($activeSlave.ID).preg == -3>> /*special states*/ - Failure to locate any ova. Subject is infertile. <</if>> diff --git a/src/pregmod/managePersonalAffairs.tw b/src/pregmod/managePersonalAffairs.tw index f782157ba7d27aa190b06d30f117194d8f03e7ac..8a212bc09f387e17146aa93caeb98c42edb38c21 100644 --- a/src/pregmod/managePersonalAffairs.tw +++ b/src/pregmod/managePersonalAffairs.tw @@ -17,6 +17,15 @@ <div> You pause for a moment from your busy day to day life to return to <<if $masterSuite != 0>>$masterSuiteName<<else>>your room<</if>> to consider some things about yourself. </div> + +<<if $geneticMappingUpgrade >= 1>> + <div> + <<if $PC.genes === "XY" && $seeDicksAffectsPregnancy === 0>> + Analysis of your sperm shows that you have a <<= $PC.spermY>>% chance of fathering a son. + <</if>> + </div> +<</if>> + <div> You take yourself in a full length mirror. You are <<= addA($PC.race)>> <<if $PC.dick != 0 && $PC.vagina != -1>>futanari<<elseif $PC.dick != 0>>man<<else>>woman<</if>> with<<if $PC.markings == "freckles">> freckled<<elseif $PC.markings == "heavily freckled">> heavily freckled<</if>> <<print $PC.skin>> skin, $PC.hColor hair, <<print App.Desc.eyesColor($PC)>> and a perfect $PC.faceShape face. <<if $PC.actualAge >= 65>> diff --git a/src/uncategorized/RECI.tw b/src/uncategorized/RECI.tw index 4b08f76033808f5d98c38407502d3a819b9b0415..0aee8085dbc3bdca5ac9f3d148af3c4611a39c95 100644 --- a/src/uncategorized/RECI.tw +++ b/src/uncategorized/RECI.tw @@ -44,7 +44,7 @@ <<set _clothesTemp = $activeSlave.clothes>> <<switch $RECIevent>> /*Some events start with the slave naked (any event that starts with the daily inspection, for example). Here we switch their clothing just for the image to load, then switch it back quickly so the player's choice is not messed up.*/ -<<case "butthole" "feminization" "futa" "MILF" "orientation" "ugly">> +<<case "feminization" "futa" "MILF" "orientation" "ugly">> <<set $activeSlave.clothes = "no clothing">> <</switch>> <span id="artFrame"> @@ -62,63 +62,12 @@ <<run Enunciate($activeSlave)>> <<set $desc = SlaveTitle($activeSlave)>> +<<set _belly = bellyAdjective($activeSlave)>> <<setLocalPronouns $activeSlave>> <<setPlayerPronouns>> <<switch $RECIevent>> -<<case "butthole">> - -<<for $i = 0; $i < $REButtholeCheckinIDs.length; $i++>> - <<if $REButtholeCheckinIDs[$i] == $activeSlave.ID>> - <<set $REButtholeCheckinIDs.deleteAt($i)>> - <<break>> - <</if>> -<</for>> - -<<if (skinToneLevel($activeSlave.skin) < 10)>> - <<set _skinDesc = "pink">> -<<elseif (skinToneLevel($activeSlave.skin) > 20)>> - <<set _skinDesc = "dark brown">> -<<else>> - <<set _skinDesc = "brown">> -<</if>> -The slave bathrooms are designed to completely eliminate privacy. There are few partitions, and those are glass. Your better-behaved slaves have all long since lost any hesitation about performing their ablutions nude. As you pass through the area, you notice <<= App.UI.slaveDescriptionDialog($activeSlave)>> checking out $his own anus in the bathroom mirror. -<br><br> -There's no other way to describe what $he's doing: the $desc has $his back to the mirror<<if $activeSlave.height < 160>> and is up on tiptoe to bring $his butthole into view<</if>>, and $he's -<<if $activeSlave.butt > 6>> - using <<if hasBothArms($activeSlave)>>both hands<<elseif !hasAnyArms($activeSlave)>>the edge of the sink<<else>>$his hand<</if>> to pull $his massive buttcheeks apart to -<<elseif $activeSlave.butt > 3>> - using <<if !hasAnyArms($activeSlave)>>the edge of the sink<<else>>$his hand<<if hasBothArms($activeSlave)>>s<</if>><</if>> to spread $his healthy buttcheeks to -<<else>> - got $his hips cocked to spread $his sleek butt and -<</if>> -reveal $his backdoor. Your slaves are trained to check themselves daily, but $he seems fascinated. As you pause to watch, $he begins to clench and relax $his <<if $activeSlave.anus > 2>>loose<<else>>cute<</if>> hole, <<if ($activeSlave.analArea - $activeSlave.anus) > 1>> lewdly flexing<<else>>alternately puckering and relaxing<</if>> the _skinDesc skin around it. $He giggles self-consciously at the sight, and then relaxes all the way, causing $his asspussy to open into a <<if $activeSlave.anus > 2>><<if $PC.dick != 0>>cock<<else>>dildo<</if>>-hungry<<else>>slight<</if>> gape. $He notices you out of the corner of $his eye and -<<if $activeSlave.butt > 6>> - releases $his grip on $his heavy buttocks to turn and greet you, letting them clap gently together and conceal $his asshole again. -<<elseif $activeSlave.butt > 3>> - lets $his butt go to turn and greet you, mostly hiding $his asshole from the mirror. -<<else>> - turns to greet you, $his pretty rear only partially concealing $his asshole in the mirror. -<</if>> -<br><br> -"Hi <<Master>>," $he <<say>>s cheerfully. "I wa<<s>> just noti<<s>>ing how much my butt ha<<s>> changed. I check it every day, but I hadn't really looked at it in a while, you know? It u<<s>>ed to be <<s>>o tight, and now <<if $activeSlave.anus > 2>>I've got a rear pu<<ss>>y<<else>>it'<<s>> obviou<<s>>ly a fuckhole<</if>>." $He turns to face the mirror, hiking one knee up onto the bathroom counter in front of it. $He -<<if $activeSlave.butt > 6>> - reaches around to pull a buttock aside and starts blatantly winking $his anus for you<<if hasAnyArms($activeSlave)>>, using $his <<if hasBothArms($activeSlave)>>other <</if>>hand to <<if $activeSlave.nipples != "fuckable">>tweak<<else>>finger<</if>> a nipple<</if>>. -<<elseif $activeSlave.butt > 3>> - spreads $himself and starts blatantly winking $his anus for you<<if hasAnyArms($activeSlave)>>, using $his hand<<if hasBothArms($activeSlave)>>s<</if>> to <<if $activeSlave.nipples != "fuckable">>tweak<<else>>finger<</if>> $his nipples<</if>>. -<<else>> - cocks $his hips again and starts blatantly winking $his anus for you<<if hasAnyArms($activeSlave)>>, using $his hand<<if hasBothArms($activeSlave)>>s<</if>> to <<if $activeSlave.nipples != "fuckable">>tweak<<else>>finger<</if>> $his nipples<</if>>. -<</if>> -<<if $activeSlave.analArea > 3>> - The huge area of _skinDesc anus around $his actual hole certainly draws the eye towards its center, though the way $he's using $his sphincter as a come-on does enhance the effect. -<</if>> -<<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>> - "Plea<<s>>e, <<Master>>," $he begins to beg. "I can't wait to feel <<if $PC.dick != 0>>your cock<<else>>you<</if>> in<<s>>ide me." -<<else>> - "Plea<<s>>e, <<Master>>," $he <<say>>s. "U<<s>>e me." -<</if>> - <<case "futa">> <<for $i = 0; $i < $REFutaSisterCheckinIDs.length; $i++>> @@ -297,326 +246,6 @@ $He looks pensive, and goes through two false starts before $he clears $his thro <span id="result"> <<switch $RECIevent>> -<<case "butthole">> - -<<if $HeadGirl != 0>> - <<if ($activeSlave.ID != $HeadGirl.ID)>> - <<link "Double anal with the Head Girl">> - <<setLocalPronouns $HeadGirl 2>> - - <<set _clothesTemp2 = $HeadGirl.clothes, $HeadGirl.clothes = "no clothing">> - <<replace "#artFrame">> - /* 000-250-006 */ - <<if $seeImages == 1>> - <div class="imageColumn"> - <div class="imageRef medImg"> - <<= SlaveArt($activeSlave, 2, 0)>> - </div> - <div class="imageRef medImg"> - <<= SlaveArt($HeadGirl, 2, 0)>> - </div> - </div> - <</if>> - /* 000-250-006 */ - <</replace>> - <<set $HeadGirl.clothes = _clothesTemp2>> - - <<replace "#result">> - <p> - You tell $him $he's got a nice asspussy, and grope $him thoroughly, cupping $his buttocks with one hand and squeezing a breast with the other. $activeSlave.slaveName looks - <<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>> - desperately eager, - <<else>> - ready and willing, - <</if>> - and angles $himself just right, but you administer a light slap to $his $activeSlave.skin ass and continue, telling $him that it's so nice you feel like sharing it. $He's - <<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>> - so ready to fuck $he can't quite think of what to say, - <<else>> - not quite sure how to respond, - <</if>> - and before $he can figure it out, $HeadGirl.slaveName hurries in, responding to your summons. Of course, $activeSlave.slaveName is no stranger to $HeadGirl.slaveName, who takes in the situation at a glance and - <<if canAchieveErection($HeadGirl)>> - instantly achieves a painfully hard erection. - <<else>> - immediately flushes with arousal. - <</if>> - $HeadGirl.slaveName - <<if !canPenetrate($HeadGirl)>> - dons a strap-on and - <</if>> - clambers up onto the (strongly built) bathroom counter. Since saliva is plenty of lube for $activeSlave.slaveName's experienced ass, _he2 points a meaningful finger at <<if !canPenetrate($HeadGirl)>>the phallus<<else>>_his2 cock<</if>>, and $activeSlave.slaveName begins to suck it enthusiastically, trying to get it as wet as possible for the sake of $his butt. - <<run seX($activeSlave, "oral", $HeadGirl, "penetrative")>> - </p> - <p> - Since $activeSlave.slaveName is being so good, you decide to help get $him ready, and push $him sideways so $he straddles the counter's edge. $He whimpers into the <<if !canPenetrate($HeadGirl)>>dildo<<else>>dick<</if>> in $his mouth as $he feels $his - <<if $activeSlave.dick > 0>> - <<if ($activeSlave.hormoneBalance >= 100) || ($activeSlave.chastityPenis == 1)>> - chastity cage - <<elseif ($activeSlave.hormoneBalance >= 100) || ($activeSlave.balls == 0) || ($activeSlave.ballType == "sterile")>> - soft dickclit - <<else>> - hard cock - <</if>> - <<else>> - mons - <</if>> - graze the hard counter, and then stiffens as you penetrate $his bottom. - <<run seX($activeSlave, "anal", $PC, "penetrative")>> - When you judge that your Head Girl is wet enough, you nod to _him2, and _he2 takes $activeSlave.slaveName by the hand, pulling $him up onto _his2 lap. - <<if ($HeadGirl.boobs > 4000) && ($activeSlave.boobs > 4000)>> - Their tits are so huge that they can't reach each other to kiss, chest-to-chest like that. $HeadGirl.slaveName settles for blowing the other slave an exaggerated kiss, which makes $him laugh. - <<else>> - The slaves start making out, showing no signs of breaking their lip lock as they arrange themselves for penetration. - <</if>> - $HeadGirl.slaveName guides _his2 - <<if !canPenetrate($HeadGirl)>> - strap-on - <<else>> - cock - <</if>> - inside the - <<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>> - enthusiastic - <<else>> - compliant - <</if>> - $activeSlave.slaveName, who begins to ride it, enjoying both the - <<if $activeSlave.dick > 0>> - prostate - <<else>> - anal - <</if>> - stimulation and the feeling of $his - <<if $activeSlave.dick > 0>> - <<if ($activeSlave.hormoneBalance >= 100) || ($activeSlave.chastityPenis == 1)>> - midsection - <<elseif ($activeSlave.hormoneBalance >= 100) || ($activeSlave.balls == 0) || ($activeSlave.ballType == "sterile")>> - soft dick - <<else>> - erection - <</if>> - trapped between $him and - <<else>> - pussy pressed against - <</if>> - $HeadGirl.slaveName. - <<run seX($activeSlave, "anal", $HeadGirl, "penetrative")>> - - $HeadGirl.slaveName smacks the humping - <<if $activeSlave.physicalAge > 30>> - $woman's - <<else>> - $girl's - <</if>> - butt to get $him to stop, and slides an index finger up $his ass alongside the - <<if !canPenetrate($HeadGirl)>> - phallus. - <<else>> - cock. - <</if>> - $activeSlave.slaveName shudders, and then begins to whine as $HeadGirl.slaveName pulls $his sphincter wider. - </p> - <p> - "Plea<<s>>e," the slave begs incoherently as you press your <<if $PC.dick != 0>>dick<<else>>strap-on<</if>> against $HeadGirl.slaveName's finger. It's not clear whether $he's begging you to DP $his anus, or begging you not to, but whichever it is, $HeadGirl.slaveName withdraws _his2 finger and you shove yourself inside. $activeSlave.slaveName jerks with discomfort and gives a gasping "Oh f-fuck-k" that - <<if $activeSlave.anus > 2>> - $he repeats over and over - <<else>> - is followed by some minor struggling - <</if>> - as you begin to fuck $him. - <<run seX($activeSlave, "anal", $PC, "penetrative")>> - From _his2 angle, $HeadGirl.slaveName can't pound $activeSlave.slaveName quite as hard as you can, but _he2 does _his2 best. When you've both had your fun, extracted yourselves, and let the exhausted, gaped bitch collapse onto the floor, $HeadGirl.slaveName gives you a naughty wink. - <<run Enunciate($HeadGirl)>> - "@@.hotpink;That wa<<s>> fun,@@ <<Master>>!" _he2 <<say>>s. "<<Sh>>all we flip $him over and go again?" - <<run Enunciate($activeSlave)>> - "@@.hotpink;Plea<<s>>e nooo,@@" comes a quiet wail from the floor. - </p> - <<set $activeSlave.devotion += 2>> - <<set $HeadGirl.devotion += 2>> - <<set $slaves[$slaveIndices[$HeadGirl.ID]] = $HeadGirl>> - <</replace>> - <</link>> - <</if>> -<</if>> -<<if $Concubine != 0>> - <<if ($activeSlave.ID != $Concubine.ID)>> - <br><<link "Double anal with your Concubine">> - <<setLocalPronouns $Concubine 2>> - - <<set _clothesTemp2 = $Concubine.clothes, $Concubine.clothes = "no clothing">> - <<replace "#artFrame">> - /* 000-250-006 */ - <<if $seeImages == 1>> - <div class="imageColumn"> - <div class="imageRef medImg"> - <<= SlaveArt($activeSlave, 2, 0)>> - </div> - <div class="imageRef medImg"> - <<= SlaveArt($Concubine, 2, 0)>> - </div> - </div> - <</if>> - /* 000-250-006 */ - <</replace>> - <<set $Concubine.clothes = _clothesTemp2>> - - <<replace "#result">> - <p> - You tell $him $he's got a nice asspussy, and grope $him thoroughly, cupping $his buttocks with one hand and squeezing a breast with the other. $He looks - <<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>> - desperately eager, - <<else>> - ready and willing, - <</if>> - and angles $himself just right, but you administer a light slap to $his $activeSlave.skin ass and continue, telling $him that it's so nice you feel like sharing it. $He's - <<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>> - so ready to fuck $he can't quite think of what to say, - <<else>> - not quite sure how to respond, - <</if>> - and before $he can figure it out, $Concubine.slaveName hurries in, responding to your summons. Of course, $activeSlave.slaveName is no stranger to $Concubine.slaveName, who takes in the situation at a glance and - <<if canAchieveErection($Concubine)>> - instantly achieves a painfully hard erection. - <<else>> - immediately flushes with arousal. - <</if>> - $Concubine.slaveName - <<if !canPenetrate($Concubine)>> - dons a strap-on and - <</if>> - clambers up onto the (strongly built) bathroom counter. Since saliva is plenty of lube for $activeSlave.slaveName's experienced ass, _he2 points a meaningful finger at - <<if !canPenetrate($Concubine)>> - the phallus, - <<else>> - _his2 cock, - <</if>> - and $activeSlave.slaveName begins to suck it enthusiastically, trying to get it as wet as possible for the sake of $his butt. - <<run seX($activeSlave, "oral", $HeadGirl, "penetrative")>> - </p> - <p> - Since $activeSlave.slaveName is being so good, you decide to help get $him ready, and push $him sideways so $he straddles the counter's edge. $He whimpers into the - <<if !canPenetrate($Concubine)>> - dildo - <<else>> - dick - <</if>> - in $his mouth as $he feels $his - <<if $activeSlave.dick > 0>> - <<if ($activeSlave.hormoneBalance >= 100) || ($activeSlave.chastityPenis == 1)>> - chastity cage - <<elseif ($activeSlave.hormoneBalance >= 100) || ($activeSlave.balls == 0) || ($activeSlave.ballType == "sterile")>> - soft dickclit - <<else>> - hard cock - <</if>> - <<else>> - mons - <</if>> - graze the hard counter, and then stiffens as you penetrate $his bottom. - <<run seX($activeSlave, "anal", $PC, "penetrative")>> - When you judge that your Concubine is wet enough, you nod to _him2, and _he2 takes $activeSlave.slaveName by the hand, pulling $him up onto _his2 lap. - <<if ($Concubine.boobs > 4000) && ($activeSlave.boobs > 4000)>> - Their tits are so huge that they can't reach each other to kiss, chest-to-chest like that. $Concubine.slaveName settles for blowing the other slave an exaggerated kiss, which makes $him laugh. - <<else>> - The slaves start making out, showing no signs of breaking their lip lock as they arrange themselves for penetration. - <</if>> - $Concubine.slaveName guides _his2 - <<if !canPenetrate($Concubine)>> - strap-on - <<else>> - cock - <</if>> - inside the - <<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>> - enthusiastic - <<else>> - compliant - <</if>> - $activeSlave.slaveName, who begins to ride it, enjoying both the - <<if $activeSlave.prostate > 0>> - prostate - <<else>> - anal - <</if>> - stimulation and the feeling of $his - <<if $activeSlave.dick > 0>> - <<if ($activeSlave.hormoneBalance >= 100) || ($activeSlave.chastityPenis == 1)>> - midsection - <<elseif ($activeSlave.hormoneBalance >= 100) || ($activeSlave.balls == 0) || ($activeSlave.ballType == "sterile")>> - soft dick - <<else>> - erection - <</if>> - trapped between $him and - <<else>> - pussy pressed against - <</if>> - $Concubine.slaveName. - <<run seX($activeSlave, "anal", $Concubine, "penetrative")>> - $Concubine.slaveName smacks the humping - <<if $activeSlave.physicalAge > 30>> - $woman's - <<else>> - $girl's - <</if>> - butt to get $him to stop, and slides an index finger up $his ass alongside the - <<if !canPenetrate($Concubine)>> - phallus. - <<else>> - cock. - <</if>> - $activeSlave.slaveName shudders, and then begins to whine as $Concubine.slaveName pulls $his sphincter wider. - </p> - <p> - "Plea<<s>>e," the slave begs incoherently as you press your - <<if $PC.dick != 0>> - dick - <<else>> - strap-on - <</if>> - against $Concubine.slaveName's finger. It's not clear whether $he's begging you to DP $his anus, or begging you not to, but whichever it is, $Concubine.slaveName withdraws _his2 finger and you shove yourself inside. $activeSlave.slaveName jerks with discomfort and gives a gasping "Oh f-fuck-k" that - <<if $activeSlave.anus > 2>> - $he repeats over and over - <<else>> - is followed by some minor struggling - <</if>> - as you begin to fuck $him. - <<run seX($activeSlave, "anal", $PC, "penetrative")>> - From _his2 angle, $Concubine.slaveName can't pound $activeSlave.slaveName quite as hard as you can, but _he2 does _his2 best. When you've both had your fun, extracted yourselves, and let the exhausted, gaped bitch collapse onto the floor, $Concubine.slaveName gives you a naughty wink. - <<run Enunciate($Concubine)>> - "@@.hotpink;That wa<<s>> fun,@@ <<Master>>!" _he2 <<say>>s. "<<Sh>>all we flip $him over and go again?" - <<run Enunciate($activeSlave)>> - "@@.hotpink;Plea<<s>>e nooo,@@" comes a quiet wail from the floor. - </p> - <<set $activeSlave.devotion += 2>> - <<set $Concubine.devotion += 2>> - <<set $slaves[$slaveIndices[$Concubine.ID]] = $Concubine>> - <</replace>> - <</link>> - <</if>> -<</if>> -<br><<link "Chat about $his ass">> - <<replace "#result">> - <<setSpokenPlayerPronouns $activeSlave>> - You head into the bathroom, shedding clothing as you go. $He stares at you as you advance, $his eyes fixing on your <<if $PC.boobs >= 300 >>tits as you reveal them<<else>>ripped abs as they become visible<</if>>, and $his lips part slightly. $His gaze only shifts when you disrobe completely, revealing your <<if $PC.dick != 0>>hardening dick<<if $PC.vagina != -1>> and <</if>><</if>><<if $PC.vagina != -1>>flushed womanhood<</if>>; $he licks $his lips unconsciously. You grab a towel off the counter, spread it on a bathroom bench, and recline on it with your back against the wall. You pat your <<if $PC.title == 1>>hard<<else>>pretty<</if>> thighs, and $he hurries over, <<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>>eagerly<<else>>carefully<</if>> swinging $his leg over the bench and seating $himself in your lap. <<if $PC.dick != 0>>Your cock slides easily up $his whorish butt. One of your arms<<else>>You decided not to bother with a strap-on, so you slide a couple of fingers inside $him, and $he reciprocates by working a hand under $himself to attend to your pussy. Your free arm<</if>> wraps around<<if $activeSlave.boobs > 4000>> $him and under $his heavy tits, resting in a cocoon of soft breastflesh<<elseif $activeSlave.boobs > 800>> $his heavy breasts, hefting their weight and eliciting a sigh from the slave<<else>> $him to support $his chest<</if>>. Being held this way, $he can't really <<if $PC.dick != 0>>bounce on your dick, so $he just wiggles $his butt into you to seat it a bit deeper<<else>>grind against your fingers<</if>> and sighs contentedly. You instruct $him to elaborate on what $he said earlier. - <br><br> - "Ye<<s>> <<Master>>," $he <<say>>s automatically, and then pauses. "Hmm. I try not to think about back, you know, before." $He squeezes $his buttocks against your <<if $PC.dick != 0>>crotch<<else>>hand<</if>>. "But I gue<<ss>> back then I didn't really think about my butthole, much? Like, I went to the bathroom, and wa<<sh>>ed it in the <<sh>>ower, and that wa<<s>> it. But with the liquid <<s>>lave food, I don't — <<s>>orry, <<Master>>, I'm being <<s>>illy. You know all about that." You tell $him to explain it anyway. $He looks puzzled for a moment, but @@.mediumaquamarine;remembers $he can trust you,@@ and twists around to plant an awkward kiss on your chin before continuing. "Well," $he <<say>>s, with mock seriousness. "Here in the arcology, we <<s>>lave<<s>> eat a very <<s>>pe<<c>>ial liquid diet that keep<<s>> u<<s>> healthy and fit and ready to fuck. And, it'<<s>> ab<<s>>orbed completely, <<s>>o our butt<<s>> are alway<<s>> ni<<c>>e and clean. That way, <<Master>> can -" $he clenches $his sphincter <<if $PC.dick != 0>>around the base of your cock — "fuck<<else>>against your invading fingers — "play with<</if>> our a<<ss>>e<<s>>" — clench — "whenever" — clench — "<<heP>>" — clench — "want<<s>>!" $He squeals as you use your encircling arm to hoist $his torso up a bit higher, and mercilessly <<if $PC.dick != 0>>fuck<<else>>fingerfuck<</if>> $his ass. Many of your other slaves came and went during this, and none of them saw anything unusual about you molesting $activeSlave.slaveName's bottom in a corner of the restroom. - <<set $activeSlave.trust += 4>> - <</replace>> -<</link>> -<<if $activeSlave.anus < 3>> -<br><<link "Change it some more">> - <<replace "#result">> - You tell $him that since $he appreciates how $his ass has changed, $he won't be surprised if you treat it like the fuckhole it is. Something in your tone makes $him cautious, but $he's a good $girl and says "Ye<<s>>, <<Master>>," automatically. You pass $assistant.name wardrobe orders for the poor <<if $activeSlave.physicalAge > 30>>$woman<<else>>$girl<</if>>, and instructions to have $him report to your office once $he's dressed. A few minutes later, $activeSlave.slaveName walks up to your desk, stark naked except for a buttplug that comfortably fills $his rectum and a sturdy leather collar attached to a leash. You snap your fingers, pointing at the ground, and $he scrambles <<if hasAllLimbs($activeSlave)>>to $his hands and knees<<else>>downwards<</if>> and removes $his plug. After $he's taken a harsh buttfuck, you <<if $PC.dick != 0>>push the plug back in without letting any of your cum escape<<else>>plug $him up again<</if>> and attach the leash to your belt. You ignore your anal toy completely, letting $him kneel next to you as you work — $he doesn't seem to want to sit, for some reason. For the rest of the day, $his anus takes the full force of your libido. You fuck nothing else, confining your efforts to $his backdoor, keeping $him plugged when you aren't penetrating $him. When you're bored, you hand $him a dildo and tell $him to take care of it $himself. - <br><br> - $He's quite exhausted by the end of the day, walking dumbly along behind you, leashed to your belt and wondering tiredly when $his next reaming is coming. $He doesn't notice that you're bringing $him back to stand in front of the mirror until $he's there. You push $his compliant body into an approximation of $his position from the morning and tell $him to remove $his plug and look at $his asshole. "Ye<<s>> <<Master>>," $he <<says>>, and obeys.<<if $PC.dick != 0>> This releases quite a rush of ejaculate.<</if>> $His anus is @@.lime;very loose,@@ a lewd, gaping fuckhole hungry for toys, fingers, and dick. You tell $him that, and ask whether $he agrees. @@.hotpink;"Ye<<s>> <<Master>>," $he <<say>>s.@@ - <<set $activeSlave.devotion += 4>> - <<set $activeSlave.anus = 3>> - <</replace>> -<</link>> -<</if>> - <<case "futa">> <<link "Love $him back">> diff --git a/src/uncategorized/REFI.tw b/src/uncategorized/REFI.tw index c1c752a72dc98a46542cd906627bde1795b08cb5..aa872753378cbb9acde11b9eab96b0a6e198f7c1 100644 --- a/src/uncategorized/REFI.tw +++ b/src/uncategorized/REFI.tw @@ -1301,7 +1301,7 @@ There was a glint of envy <<if canSee($activeSlave)>>in $his eyes when $he saw<< <<else>> "I would love to knock <<s>>omeone up, <<Master>>!" <</if>> - <<if $activeSlave.toyHole == "dick">> + <<if $activeSlave.toyHole == "dick" || $policies.sexualOpeness == 1>> You push $him onto the couch, line yourself up with $his throbbing erection, and ask if $he wants to impregnate a girl. $He's almost beside $himself, shuddering at the titillation, but before $he can answer, you tell $him that getting to use $his dick is a very special reward for very good slaves, and you might give it to $him one day — but that $he doesn't deserve it yet. With that, you tease the tip of $his penis with your pussy; a clear mistake, as this sets $him over the edge. $He can only gasp wordlessly over having just accidentally came in $his <<= WrittenMaster()>>, something you take full advantage of. You clearly inform $him that you were fertile. //Were.// You continue to tease the blooming impregnation fetishist with descriptions of how hard it will be for you so heavily laden with child and how $he had better plan on taking responsibility. $He can't take it and releases another spurt of cum, this time onto $himself; <<if canImpreg($PC, $activeSlave)>> <<= knockMeUp($PC, 20, 0, $activeSlave.ID, 1)>> @@ -1316,7 +1316,7 @@ There was a glint of envy <<if canSee($activeSlave)>>in $his eyes when $he saw<< <<set $activeSlave.devotion += 4>> <<set $activeSlave.fetish = "pregnancy", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65>> <</replace>> - <</link>><<if $activeSlave.toyHole == "dick" && canImpreg($PC, $activeSlave)>>//This option may result in you getting knocked up.<</if>> + <</link>><<if ($activeSlave.toyHole == "dick" || $policies.sexualOpeness == 1) && canImpreg($PC, $activeSlave)>>//This option may result in you getting knocked up.<</if>> <<else>> <<link "Turn $him into another fertility whore despite $his barrenness">> <<replace "#result">> @@ -1436,7 +1436,7 @@ There was a glint of envy <<if canSee($activeSlave)>>in $his eyes when $he saw<< <<set $activeSlave.devotion += 6, $activeSlave.trust += 4>> <<run seX($activeSlave, "penetrative", $PC, "vaginal")>> <<else>> - You order $him to lie down on the couch, an order $he follows dutifully. You correct $him; $he should be on $his back for what's to come. $He's almost beside $himself, shuddering at the prospect of what's to come, but first, you ask $him if the thought of being ridden by such a pregnant woman turns $him on. $He turns red, but before $he has the chance to formulate an answer, you've got $his telltale erection lined up with your needy pussy. You force $him to frame a response: + You order $him to lie down on the couch, an order $he follows dutifully. You correct $him; $he should be on $his back for what's to come. $He's almost beside $himself, shuddering at the prospect of pregnant sex, but first, you ask $him if the thought of being ridden by such a gravid woman turns $him on. $He turns red, but before $he has the chance to formulate an answer, you've got $his telltale erection lined up with your needy pussy. You force $him to frame a response: <<if !canTalk($activeSlave)>> $he only manages a nod before you spear yourself on $his dick. This was happening either way. <<else>> diff --git a/src/uncategorized/saDiet.tw b/src/uncategorized/saDiet.tw index 333f82a703419a3019678fa22c540546e1f1ad07..b3ad1278579f7e9bd5d0687bbeaeb943d654a8fd 100644 --- a/src/uncategorized/saDiet.tw +++ b/src/uncategorized/saDiet.tw @@ -1016,7 +1016,7 @@ <</if>> <</if>> <<case "fertility">> /* + ovum and small boosts to energy and attrXY */ - <<if !isFertile($slaves[$i]) || $slaves[$i].preg != 0>> + <<if !isFertile($slaves[$i]) || ($slaves[$i].preg < 0) || ($slaves[$i].preg > 0 && ($slaves[$i].geneticQuirks.superfetation != 2 || $geneticMappingUpgrade < 1))>> <<if $slaves[$i].pregKnown == 0 && $slaves[$i].preg > 0>> The diet is not properly working; tests reveal the reason is a @@.lime;new pregnancy.@@ <<set $slaves[$i].pregKnown = 1>> diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw index 5dbbffc417006ce50ce051cf60b8519735f0dc6d..d31a941c2e2fd0866922da794973ad1c462013d1 100644 --- a/src/uncategorized/saLongTermEffects.tw +++ b/src/uncategorized/saLongTermEffects.tw @@ -6121,7 +6121,7 @@ <</if>> <</if>> <<if ($slaves[$i].intelligenceImplant > 15 || $slaves[$i].intelligenceImplant < 0) && $arcologies[0].FSGenderFundamentalistLawBimbo == 1>> - Society @@.green;disapproves@@ of encouraging a woman's education. + Society @@.red;disapproves@@ of encouraging a woman's education. <<= FutureSocieties.ChangePorn("GenderFundamentalist", -1)>> <</if>> <<if ($slaves[$i].devotion <= 95) && canPenetrate($slaves[$i])>> @@ -7671,7 +7671,7 @@ <<else>> $His vagina oddly begins to @@.lime;produce more sexual fluids@@ in apparent preparation to $his upcoming birth. <</if>> - <<set $slave.vaginaLube += 1>> + <<set $slaves[$i].vaginaLube += 1>> <</if>> <</if>> diff --git a/src/uncategorized/slaveSold.tw b/src/uncategorized/slaveSold.tw index cc796ef8c4a0fe2055ac6d062be4716f3800124a..1d96e9ade08d29e7848c04f51183e5a1af314ceb 100644 --- a/src/uncategorized/slaveSold.tw +++ b/src/uncategorized/slaveSold.tw @@ -1063,6 +1063,7 @@ <<case "peacekeepers">> $activeSlave.slaveName is delivered to General $peacekeepers.generalName's forces, to serve as a barracks whore. Several days later, the purchasing officer forwards a short shot of $activeSlave.slaveName + <<set _slaveCost = slaveCost($activeSlave)>> <<if $peacekeepers.tastes == 0>> <<if _slaveCost > random(10000,50000) || $peacekeepers.attitude > 90>><<set _influential = 1>><<else>><<set _influential = 0>><</if>> <<if _influential && $activeSlave.belly >= 300000>> diff --git a/src/uncategorized/walkPastList.tw b/src/uncategorized/walkPastList.tw index 842a4dcea96fbae3f449d0da860a66b138b2435a..adc79014a67ec6b5ddc9f7e80dec35453b435af3 100644 --- a/src/uncategorized/walkPastList.tw +++ b/src/uncategorized/walkPastList.tw @@ -1,6 +1,6 @@ :: Walk Past List [nobr] -<<set $nextButton = "Back to Main", $nextLink = "Main", _target = $target>> +<<set $nextButton = "Back to Main", $nextLink = "Main">> //For testing purposes only, this page lists or can produce all of the "walk past" scenes.//<br> <br> @@ -8,52 +8,47 @@ <br> <h2>Choose target</h2> -Target: <span id="target">$target</span><br> <<link "Lips">> - <<set $target = "FLips">> - <<goto "Walk Past List">> + <<replace "#wplist">> + <<print walkPastAll("FLips")>> + <</replace>> <</link>><br> <<link "Boobs">> - <<set $target = "FBoobs">> - <<goto "Walk Past List">> + <<replace "#wplist">> + <<print walkPastAll("FBoobs")>> + <</replace>> <</link>><br> <<link "Butt">> - <<set $target = "FButt">> - <<goto "Walk Past List">> + <<replace "#wplist">> + <<print walkPastAll("FButt")>> + <</replace>> <</link>> | <<link "Anus">> - <<set $target = "FAnus">> - <<goto "Walk Past List">> + <<replace "#wplist">> + <<print walkPastAll("FAnus")>> + <</replace>> <</link>> | <<link "Vagina">> - <<set $target = "FVagina">> - <<goto "Walk Past List">> + <<replace "#wplist">> + <<print walkPastAll("FVagina")>> + <</replace>> <</link>> //or ass if they lack one//<br> <<link "Dick">> - <<set $target = "FDick">> - <<goto "Walk Past List">> + <<replace "#wplist">> + <<print walkPastAll("FDick")>> + <</replace>> <</link>><br> <<link "Rival">> - <<set $target = "FRival">> - <<goto "Walk Past List">> + <<replace "#wplist">> + <<print walkPastAll("FRival")>> + <</replace>> <</link>><br> <<link "Relation">> - <<set $target = "FRelation">> - <<goto "Walk Past List">> -<</link>><br> + <<replace "#wplist">> + <<print walkPastAll("FRelation")>> + <</replace>> +<</link>> <h2>Walk Past List</h2> -<<for _i = 0; _i < $slaves.length; _i++>> - <<set $activeSlave = $slaves[_i]>> - <<capture $activeSlave>> - <<set _print = "">> - <<set _print = walkPast($slaves[_i], "fixed")>> - <<if _print>> - <<print _print + "<br><br>">> - <</if>> - <<if $target != _target>> - <<set $target = _target>> - <</if>> - <</capture>> -<</for>> +<span id="wplist"></span>