diff --git a/js/medicine/surgery/addGenitals/addOvaries.js b/js/medicine/surgery/addGenitals/addOvaries.js index 65ed27678548d3151cd6cc6e6b4b1c18fc380c13..4432b54dd5e12b50ce7734415c70e176a124b258 100644 --- a/js/medicine/surgery/addGenitals/addOvaries.js +++ b/js/medicine/surgery/addGenitals/addOvaries.js @@ -97,6 +97,9 @@ App.Medicine.Surgery.Procedures.OFAddOvaries = class extends App.Medicine.Surger this._slave.pubertyXX = 1; } } + if (V.menstruation === 1) { + this._slave.fertPeak = 1; + } if (this.eggType === "human") { return this._assemble(new App.Medicine.Surgery.Reactions.AddOvaries()); @@ -147,6 +150,9 @@ App.Medicine.Surgery.Procedures.OFReplaceOvaries = class extends App.Medicine.Su this._slave.pubertyXX = 1; } } + if (V.menstruation === 1) { + this._slave.fertPeak = 1; + } if (this.eggType === "human") { return this._assemble(new App.Medicine.Surgery.Reactions.AddOvaries()); diff --git a/js/medicine/surgery/addGenitals/asexualReproOvaries.js b/js/medicine/surgery/addGenitals/asexualReproOvaries.js index 737aa95b212f53817f2ec5a71121cce8048645bb..5b2b1135037263969d5b00f05396314048f1c3d3 100644 --- a/js/medicine/surgery/addGenitals/asexualReproOvaries.js +++ b/js/medicine/surgery/addGenitals/asexualReproOvaries.js @@ -57,6 +57,9 @@ App.Medicine.Surgery.Procedures.OFAsexualReproOvaries = class extends App.Medici apply(cheat) { if (this._slave.preg < -1) { this._slave.preg = 0; + if (V.menstruation === 1) { + this._slave.fertPeak = 1; + } } this._slave.eggType = "human"; this._slave.pregData = _.cloneDeep(App.Data.misc.pregData.human); diff --git a/js/medicine/surgery/addGenitals/freshOvaries.js b/js/medicine/surgery/addGenitals/freshOvaries.js index ec557c0c7960e5f6051413af762ec6d09bc47809..8c9d34ef003814a9dc2d64515e2af495610dc5bb 100644 --- a/js/medicine/surgery/addGenitals/freshOvaries.js +++ b/js/medicine/surgery/addGenitals/freshOvaries.js @@ -50,6 +50,9 @@ App.Medicine.Surgery.Procedures.OFFreshOvaries = class extends App.Medicine.Surg this._slave.pubertyXX = 1; } } + if (V.menstruation === 1) { + this._slave.fertPeak = 1; + } return this._assemble(new App.Medicine.Surgery.Reactions.FreshOvaries()); } }; diff --git a/js/medicine/surgery/addGenitals/immortalOvaries.js b/js/medicine/surgery/addGenitals/immortalOvaries.js index b62335ba319939af30bc168bacaa8bd4126284af..3fbeb98b7cfcffb1b34e3ee654d1546beeb15f55 100644 --- a/js/medicine/surgery/addGenitals/immortalOvaries.js +++ b/js/medicine/surgery/addGenitals/immortalOvaries.js @@ -57,6 +57,9 @@ App.Medicine.Surgery.Procedures.OFImmortalOvaries = class extends App.Medicine.S this._slave.pubertyXX = 1; } } + if (V.menstruation === 1) { + this._slave.fertPeak = 1; + } return this._assemble(new App.Medicine.Surgery.Reactions.ImmortalOvaries()); } }; diff --git a/js/medicine/surgery/addGenitals/mpreg.js b/js/medicine/surgery/addGenitals/mpreg.js index a70a347e2594ef06d20704fbdda036719fa753a4..adcb211ce1e95e1dfff842e19e3eb3ba53042f28 100644 --- a/js/medicine/surgery/addGenitals/mpreg.js +++ b/js/medicine/surgery/addGenitals/mpreg.js @@ -66,6 +66,9 @@ App.Medicine.Surgery.Procedures.OFAddMPreg = class extends App.Medicine.Surgery. this._slave.pubertyXX = 1; } } + if (V.menstruation === 1) { + this._slave.fertPeak = 1; + } return this._assemble(new App.Medicine.Surgery.Reactions.AddMPreg()); } }; diff --git a/js/medicine/surgery/genitals/fertility.js b/js/medicine/surgery/genitals/fertility.js index e421107cee4fd815bde80f5bd4b755643592632e..abb7ad5b1cbdd89184e10f1600aac617af40a947 100644 --- a/js/medicine/surgery/genitals/fertility.js +++ b/js/medicine/surgery/genitals/fertility.js @@ -38,6 +38,9 @@ App.Medicine.Surgery.Procedures.RestoreFertility = class extends App.Medicine.Su apply(cheat) { this._slave.preg = 0; + if (V.menstruation === 1) { + this._slave.fertPeak = 1; + } return this._assemble(new App.Medicine.Surgery.Reactions.Fertility()); } }; diff --git a/js/medicine/surgery/genitals/mpregRemoved.js b/js/medicine/surgery/genitals/mpregRemoved.js index 319dbf22562f114b3d037fb755240856538df8ce..d5416c61319452397eacd4e3c9ea8721494fd9ed 100644 --- a/js/medicine/surgery/genitals/mpregRemoved.js +++ b/js/medicine/surgery/genitals/mpregRemoved.js @@ -24,6 +24,9 @@ App.Medicine.Surgery.Procedures.RemoveMPreg = class extends App.Medicine.Surgery this._slave.mpreg = 0; this._slave.ovaImplant = OvaryImplantType.NONE; this._slave.wombImplant = "none"; + if (V.menstruation === 1) { + this._slave.fertPeak = 1; + } return this._assemble(new App.Medicine.Surgery.Reactions.MPregRemoved()); } }; diff --git a/js/medicine/surgery/genitals/preg.js b/js/medicine/surgery/genitals/preg.js index a1c108538d277a12247a8affe8a9699ed2f6718b..078a1132dd3498fefc81a972afb7e16cfaa83bda 100644 --- a/js/medicine/surgery/genitals/preg.js +++ b/js/medicine/surgery/genitals/preg.js @@ -77,6 +77,9 @@ App.Medicine.Surgery.Procedures.ImplantPregGenerator = class extends App.Medicin this._slave.broodmother = 1; this._slave.broodmotherFetuses = 1; this._slave.pregControl = "none"; + if (V.menstruation === 1) { + this._slave.fertPeak = 0; + } return this._assemble(new App.Medicine.Surgery.Reactions.Preg()); } }; diff --git a/js/medicine/surgery/genitals/pregRemove.js b/js/medicine/surgery/genitals/pregRemove.js index 8ed5c2e3f4579aab49ceddeb90ea69f8bdb7b8a8..ad56e6259e9f74ca30b37534c0a87ee2d56da2d7 100644 --- a/js/medicine/surgery/genitals/pregRemove.js +++ b/js/medicine/surgery/genitals/pregRemove.js @@ -47,6 +47,9 @@ App.Medicine.Surgery.Procedures.RemovePregGenerator = class extends App.Medicine this._slave.broodmotherFetuses = 0; this._slave.broodmotherOnHold = 0; this._slave.pregControl = "none"; + if (V.menstruation === 1) { + this._slave.fertPeak = 1; + } return this._assemble(new App.Medicine.Surgery.Reactions.PregRemove()); } }; diff --git a/js/medicine/surgery/genitals/sterilize.js b/js/medicine/surgery/genitals/sterilize.js index 8e822bd5c0951e39eae615acdd52a3798be827a6..52452311b8a51507a8cc673264353e404dadc5b4 100644 --- a/js/medicine/surgery/genitals/sterilize.js +++ b/js/medicine/surgery/genitals/sterilize.js @@ -41,6 +41,9 @@ App.Medicine.Surgery.Procedures.Sterilize = class extends App.Medicine.Surgery.P apply(cheat) { this._slave.preg = -2; + if (V.menstruation === 1) { + this._slave.fertPeak = 1; + } return this._assemble(new App.Medicine.Surgery.Reactions.Sterilize()); } }; @@ -58,6 +61,9 @@ App.Medicine.Surgery.Procedures.Oophorectomy = class extends App.Medicine.Surger this._slave.ovaries = 0; this._slave.ovaImplant = OvaryImplantType.NONE; this._slave.wombImplant = "none"; + if (V.menstruation === 1) { + this._slave.fertPeak = 1; + } return this._assemble(new App.Medicine.Surgery.Reactions.Sterilize()); } }; diff --git a/src/data/verification/verifyHumanState.js b/src/data/verification/verifyHumanState.js index 31f28d85f6e64f477488a7c103fed834ca8f12a9..0ca9b779344bda98d3bda7c1900d9a78fd1b78f5 100644 --- a/src/data/verification/verifyHumanState.js +++ b/src/data/verification/verifyHumanState.js @@ -192,7 +192,7 @@ App.Verify.I.humanPregnancy = (actor, location) => { if (actor.pubertyXX === 0 && (actor.ovaries > 0 || actor.mpreg > 0) && actor.preg === -1) { actor.preg = 0; // no contraceptives for prepubescent humans } - actor.fertPeak = Math.clamp(+actor.fertPeak, 0, 4) ?? 0; + actor.fertPeak = Math.clamp(+actor.fertPeak, -10, 10) ?? 0; // @ts-expect-error Type 'number' is not assignable to type ... actor.broodmother = Math.clamp(+actor.broodmother, 0, 3) ?? 0; actor.broodmotherFetuses = Math.max(+actor.broodmotherFetuses, 0) ?? 0; diff --git a/src/endWeek/nextWeek/nextWeek.js b/src/endWeek/nextWeek/nextWeek.js index 133ab69c041cbfd0e4a3f04b4bde0d892f853690..a686a853d0afcf92ed35a469219c7aca2d870c9e 100644 --- a/src/endWeek/nextWeek/nextWeek.js +++ b/src/endWeek/nextWeek/nextWeek.js @@ -76,7 +76,28 @@ App.EndWeek.nextWeek = function() { } } if (V.menstruation === 1) { - // TODO + if (V.PC.preg < -1 || (!V.PC.ovaries && !V.PC.mpreg) || V.PC.pubertyXX === 0 || V.PC.ovaryAge >= 47) { + // Handle sterility. Contraceptives will still continue the cycle. + V.PC.fertPeak = 1; + } else if (V.PC.geneticQuirks.superfetation === 2) { + if (V.PC.womb.length > 0) { + if (V.PC.fertPeak === 0) { + V.PC.fertPeak = 1; + } + V.PC.fertPeak--; + } else { + V.PC.fertPeak = 0; + } + } else if (V.PC.pregWeek < 0) { + V.PC.fertPeak = 2; + } else { + if (V.PC.fertPeak === 0) { + // Assume a standard 4 week cycle + V.PC.fertPeak += 3; + } else if (V.PC.fertPeak > 0) { + V.PC.fertPeak--; + } + } } else if (V.PC.geneticQuirks.superfetation === 2 && V.PC.womb.length > 0) { if (V.PC.fertPeak === 0) { V.PC.fertPeak = 1; @@ -200,7 +221,34 @@ App.EndWeek.nextWeek = function() { } } if (V.menstruation === 1) { - // TODO + if (slave.preg < -1 || (!slave.ovaries && !slave.mpreg) || slave.pubertyXX === 0 || slave.ovaryAge >= 47) { + // Handle sterility. Contraceptives will still continue the cycle. + slave.fertPeak = 1; + } else if (slave.geneticQuirks.superfetation === 2) { + // Handle Superfetation + if (slave.womb.length > 0) { + if (slave.fertPeak === 0) { + slave.fertPeak = 1; + } + slave.fertPeak--; + } else { + slave.fertPeak = 0; + } + } else if (slave.preg > 0) { + slave.fertPeak = 2; + } else if (slave.pregWeek < 0 || slave.preg > 0) { + slave.fertPeak = 2; + } else { + if (slave.fertPeak === 0) { + // Assume a standard 4 week cycle + slave.fertPeak += 3; + } else if (slave.fertPeak > 0) { + slave.fertPeak--; + } else if (slave.fertPeak < 0) { + // This logics lets you go into the negatives. This allows multiple risky weeks in a row. + slave.fertPeak++; + } + } } else if (slave.geneticQuirks.superfetation === 2 && slave.womb.length > 0) { if (slave.fertPeak === 0) { slave.fertPeak = 1; diff --git a/src/facilities/surgery/analyzePregnancy.js b/src/facilities/surgery/analyzePregnancy.js index 8f29becd3cb5f2d6dd39ec227c9bbdd38c650822..3c5198db72434e83467b315abd3000dd87ab814f 100644 --- a/src/facilities/surgery/analyzePregnancy.js +++ b/src/facilities/surgery/analyzePregnancy.js @@ -391,6 +391,8 @@ App.UI.analyzePregnancy = function() { App.UI.DOM.appendNewElement("div", node, `Subject is in the postpartum period, and will regain fertility in ${num(slave.pregWeek * -1)} ${slave.pregWeek === -1 ? `week` : `weeks`}.`); } else if (slave.preg === -1) { // special states App.UI.DOM.appendNewElement("div", node, `Contraceptive agents detected in subject.`); + } else if (V.menstruation === 1 && slave.fertPeak > 0 && slave.preg === 0) { + App.UI.DOM.appendNewElement("div", node, `${He} is currently in ${his} safe week and not ovulating. ${His} next risky weak will be in ${num(slave.fertPeak)} week${slave.fertPeak > 1 ? 's' : ''}`); } return node; diff --git a/src/facilities/surgery/surgeryPassageLower.js b/src/facilities/surgery/surgeryPassageLower.js index 1ff5e3e4cb8f5a7cb8a3a08fcf56d9217e5bb477..4926fe32a8f23281e12916f8d335cdf466970ba7 100644 --- a/src/facilities/surgery/surgeryPassageLower.js +++ b/src/facilities/surgery/surgeryPassageLower.js @@ -387,7 +387,7 @@ App.UI.surgeryPassageLower = function(slave, refresh, cheat = false) { App.UI.DOM.appendNewElement("div", el, `${His} indenture forbids elective surgery`, ["choices", "note"]); } else if (slave.breedingMark === 1 && V.propOutcome === 1 && V.eugenicsFullControl !== 1 && FutureSocieties.isActive('FSRestart')) { App.UI.DOM.appendNewElement("div", el, `${He} is protected from extreme surgery`, ["choices", "note"]); - } else if (isFertile(slave) && slave.ovaryAge <= 46) { + } else if (isFertile(slave, true) && slave.ovaryAge <= 46) { r.push(`${He} could be made into a broodmother.`); linkArray.push(App.Medicine.Surgery.makeLink( new App.Medicine.Surgery.Procedures.ImplantPregGenerator(slave), diff --git a/src/gui/options/options.js b/src/gui/options/options.js index 2c7278ac5bfa7e5d390d8c27cbcf8676daa5b7f8..3b79aa9402f46278789be9c44aba1cfd8668e7aa 100644 --- a/src/gui/options/options.js +++ b/src/gui/options/options.js @@ -815,6 +815,10 @@ App.UI.optionsPassage = function() { .addValue("Enabled", 1).on().addValue("Disabled", 0).off() .addComment("This will sort rule assistant output. You may benefit if you have a lot of rules, but only want to look out for a specific portion of it."); + options.addOption("Slave Fertility Cycles", "menstruation") + .addValue("Enabled", 1).on().addValue("Disabled", 0).off() + .addComment("Adds slave fertility cycles. Slaves can only get pregnant on their fertile week. Fertility drugs can force slaves into a fertile week."); + options.addOption("Random slave events repeat control", "level", V.eventControl) .addValue("No control", 0, () => V.eventControl.RIEPerWeek = Math.min(V.eventControl.RIEPerWeek, 3)) .addValue("Soft", 2, () => V.eventControl.RIEPerWeek = Math.min(V.eventControl.RIEPerWeek, 3)) diff --git a/src/interaction/siPhysicalRegimen.js b/src/interaction/siPhysicalRegimen.js index 5b46d6c884cccad274c237eae6feeaaae777094d..1a6ab713ee352bb49c15f2b2f23ce9ad09158048 100644 --- a/src/interaction/siPhysicalRegimen.js +++ b/src/interaction/siPhysicalRegimen.js @@ -415,6 +415,8 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) { fertility = "using contraceptives"; } else if (slave.pregWeek < 0) { fertility = "postpartum"; + } else if (V.menstruation === 1 && slave.fertPeak > 0 && slave.preg === 0) { + fertility = "safe"; } else if (slave.preg === 0) { fertility = "fertile"; } else if (slave.preg < 4 && (slave.broodmother === 0 || slave.broodmotherOnHold === 1)) { diff --git a/src/interaction/siWork.js b/src/interaction/siWork.js index 7065f9607994cfa08e6b482855a2a1dad9072821..09a58af3116ee20fde939ac7f5e2f9695ce54c88 100644 --- a/src/interaction/siWork.js +++ b/src/interaction/siWork.js @@ -416,7 +416,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) { sexOptions.push({text: `Get a footjob`, scene: () => App.Interact.fFeet(slave)}); } - if (canGetPregnant(slave) && (slave.geneticQuirks.superfetation !== 2 || V.geneticMappingUpgrade !== 0) && (slave.fuckdoll === 0) && V.seePreg !== 0) { + if (canGetPregnant(slave) && (slave.geneticQuirks.superfetation !== 2 || V.geneticMappingUpgrade !== 0 || slave.womb.length < 1) && (slave.fuckdoll === 0) && V.seePreg !== 0) { if (canImpreg(slave, V.PC) || canFemImpreg(slave, V.PC)) { sexOptions.push({ text: `Impregnate ${him} yourself`, diff --git a/src/js/pregJS.js b/src/js/pregJS.js index 6632fa4362e50561252553022e86b9f88ea32f18..51c7c62cb93cb9a0e2b9a44a75e8d6c4c434673a 100644 --- a/src/js/pregJS.js +++ b/src/js/pregJS.js @@ -408,22 +408,22 @@ globalThis.knockMeUp = function(target, chance, hole, fatherID) { target.pregType = setPregType(target); WombImpregnate(target, target.pregType, fatherID, 1); - if (V.menstruation === 1) { - // + + target.pregKnown = 1; + if (target.ID === -1) { + /* r += "<span class="lime">You have gotten pregnant.</span>"; */ } else { - target.pregKnown = 1; - if (target.ID === -1) { - /* r += "<span class="lime">You have gotten pregnant.</span>"; */ + const {He} = getPronouns(target); + r += `<span class="lime">${He} has become pregnant.</span>`; + } + if (V.menstruation === 1) { + target.fertPeak = 1; + } + if (target.geneticQuirks.superfetation === 2 && target.womb.length > 0) { + if (V.seeHyperPreg === 1) { + target.fertPeak = 1; } else { - const {He} = getPronouns(target); - r += `<span class="lime">${He} has become pregnant.</span>`; - } - if (target.geneticQuirks.superfetation === 2 && target.womb.length > 0) { - if (V.seeHyperPreg === 1) { - target.fertPeak = 1; - } else { - target.fertPeak = 4; - } + target.fertPeak = 4; } } } @@ -488,26 +488,25 @@ globalThis.tryKnockMeUp = function(mother, chance, hole, father) { mother.pregType = setPregType(mother); WombImpregnate(mother, mother.pregType, father.ID, 1); - if (V.menstruation === 1) { - // + mother.pregKnown = 1; + if (mother.ID === -1) { + /* r += "<span class="lime">You have gotten pregnant.</span>"; */ } else { - mother.pregKnown = 1; - if (mother.ID === -1) { - /* r += "<span class="lime">You have gotten pregnant.</span>"; */ + const {He, him} = getPronouns(mother); + if (father.ID === -1) { + r += `<span class="lime">${He} has become pregnant.</span>`; } else { - const {He, him} = getPronouns(mother); - if (father.ID === -1) { - r += `<span class="lime">${He} has become pregnant.</span>`; - } else { - r += `<span class="lime">${father.slaveName} has gotten ${him} pregnant.</span>`; - } + r += `<span class="lime">${father.slaveName} has gotten ${him} pregnant.</span>`; } - if (mother.geneticQuirks.superfetation === 2 && mother.womb.length > 0) { - if (V.seeHyperPreg === 1) { - mother.fertPeak = 1; - } else { - mother.fertPeak = 4; - } + } + if (V.menstruation === 1) { + mother.fertPeak = 1; + } + if (mother.geneticQuirks.superfetation === 2 && mother.womb.length > 0) { + if (V.seeHyperPreg === 1) { + mother.fertPeak = 1; + } else { + mother.fertPeak = 4; } } } @@ -580,6 +579,9 @@ globalThis.TerminatePregnancy = function(slave) { // very early slave.pregWeek = -1; } + if (V.menstruation === 1) { + slave.fertPeak = 2; + } WombFlush(slave); SetBellySize(slave); }; diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js index e5a25768243ee1fb2f01208af8108b0898f839cc..98cef4072b64a17854777187a03775c38c570537 100644 --- a/src/js/slaveSummaryWidgets.js +++ b/src/js/slaveSummaryWidgets.js @@ -235,7 +235,9 @@ App.UI.SlaveSummaryRenderers = function() { makeSpan(c, "Postpartum", styles); } else if (slave.preg === -1) { makeSpan(c, "CC", styles); - } else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) { + } else if (V.menstruation === 1 && slave.fertPeak > 0 && slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) { + makeSpan(c, "Safe", styles); + } else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) { makeSpan(c, "Fert+", styles); } else if (((slave.preg < slave.pregData.normalBirth / 10) && (slave.preg > 0) && slave.pregKnown === 0) || slave.pregWeek === 1) { makeSpan(c, "Preg?", styles); @@ -581,6 +583,8 @@ App.UI.SlaveSummaryRenderers = function() { } } else if (slave.preg === -1) { makeSpan(c, "On contraceptives.", styles); + } else if (V.menstruation === 1 && slave.fertPeak > 0 && slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) { + makeSpan(c, "Safe.", styles); } else if (slave.preg === 0 && (slave.ovaries === 1 || slave.mpreg === 1)) { makeSpan(c, "Fertile.", styles); } else if ((slave.preg >= 36) && (slave.broodmother > 0)) { diff --git a/src/js/states/002-HumanState.js b/src/js/states/002-HumanState.js index 55c3a203b0ecbbea5461e591e2aefeeb2da2cb20..24843c91ea59c226a70bf2444efd76df78f438d3 100644 --- a/src/js/states/002-HumanState.js +++ b/src/js/states/002-HumanState.js @@ -658,7 +658,7 @@ App.Entity.HumanState = class HumanState extends App.Entity.GenePoolRecord { /** * Menstrual cycle control variable. * - * * 0: Danger week + * * 0-: Danger week * * 1+: safe week */ this.fertPeak = 0; diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js index d4d72366a36afc3b9770178c0de7ef26e41951e6..f72785b623f094b33dfdb096aad20b5f6094165c 100644 --- a/src/js/statsChecker/statsChecker.js +++ b/src/js/statsChecker/statsChecker.js @@ -600,11 +600,13 @@ globalThis.canGetPregnant = function(slave) { return false; }; -/** contraceptives (.preg === -1) do not negate this function +/** + * contraceptives (.preg === -1) do not negate this function * @param {FC.HumanState} slave + * @param {boolean} ignoreCycle ignoreCycle=true will not take into account menstruation * @returns {boolean} */ -globalThis.isFertile = function(slave) { +globalThis.isFertile = function(slave, ignoreCycle=false) { if (!slave) { return null; } @@ -631,10 +633,14 @@ globalThis.isFertile = function(slave) { return false; } else if (slave.mpreg === 1 || slave.ovaries === 1) { if (slave.womb.length > 0) { // superfetation route - if (slave.fertPeak !== 0) { + if (slave.fertPeak > 0) { return false; } } + // Menstruation route. + if (!ignoreCycle && V.menstruation === 1 && slave.fertPeak > 0 ) { + return false; + } return true; } return false; diff --git a/src/npc/descriptions/style/collar.js b/src/npc/descriptions/style/collar.js index 953462bb634b467e1c8a8502bb5910c3a524956c..84a5c09801a510de7924e5241ab914f5af23f187 100644 --- a/src/npc/descriptions/style/collar.js +++ b/src/npc/descriptions/style/collar.js @@ -37,6 +37,8 @@ App.Desc.collar = function(slave) { r.push(`"Womb not detected!"`); } else if ((slave.ovaries > 0 || slave.mpreg > 0) && slave.pubertyXX === 0 && slave.physicalAge < V.fertilityAge) { r.push(`"I'm not old enough to get pregnant yet!"`); + } else if (V.menstruation === 1 && slave.fertPeak > 0) { + r.push(`"I'm not ovulating right now!"`); } else { r.push(`"I'm infertile!"`); } @@ -73,6 +75,8 @@ App.Desc.collar = function(slave) { } } else if (isFertile(slave)) { r.push(`"My womb needs filling!"`); + } else if (V.menstruation === 1 && slave.fertPeak > 0) { + r.push(`"My next risky period is in ${num(slave.fertPeak)} week${slave.fertPeak > 1 ? 's' : ''}!"`); } else if ((slave.ovaries > 0 || slave.mpreg > 0) && slave.pubertyXX === 0) { r.push(`"I should be fertile`); if (slave.pubertyAgeXX - slave.physicalAge > 2) { @@ -106,6 +110,8 @@ App.Desc.collar = function(slave) { r.push(`"Put a baby in me today!"`); } else if ((slave.ovaries > 0 || slave.mpreg > 0) && slave.pubertyXX === 0 && slave.physicalAge < V.fertilityAge) { r.push(`"I'm too young to get pregnant!"`); + } else if (V.menstruation === 1 && slave.fertPeak > 0) { + r.push(`"This is a safe week!"`); } else { r.push(`"Try to knock me up some other time!"`); } diff --git a/src/npc/generate/slaveGenerationJS.js b/src/npc/generate/slaveGenerationJS.js index 71ca61bbf845e116985bf39cc145c5b79a5d7bfe..99d1063db4ef96ee4c0331397e563b49184c0ea7 100644 --- a/src/npc/generate/slaveGenerationJS.js +++ b/src/npc/generate/slaveGenerationJS.js @@ -1443,6 +1443,9 @@ globalThis.generatePronouns = function(slave) { globalThis.generatePuberty = function(slave) { if (((slave.ovaries === 1 || slave.mpreg === 1) && slave.physicalAge >= slave.pubertyAgeXX) || slave.pubertyXX === 1) { slave.pubertyXX = 1; + if (V.menstruation === 1 && slave.geneticQuirks.superfetation < 2) { + slave.fertPeak = jsRandom(0, 3); + } } else { if (slave.preg >= -1) { slave.preg = 0; diff --git a/src/npc/surgery/surgery.js b/src/npc/surgery/surgery.js index 5f6e3966780701f838a6d53688fb03782978f196..8ff0dde4acf3500b802967907a2d3d7a2f9ce0aa 100644 --- a/src/npc/surgery/surgery.js +++ b/src/npc/surgery/surgery.js @@ -561,7 +561,10 @@ globalThis.surgeryAmp = function(slave, part, cheat = false) { } if (slave.drugs === "clitoris enhancement" || slave.drugs === "intensive clitoris enhancement") { slave.drugs = "no drugs"; - } + } + if (V.menstruation === 1) { + slave.fertPeak = 1; + } surgeryDamage(slave, 20, cheat); break; case "voicebox": diff --git a/src/player/electiveSurgery.js b/src/player/electiveSurgery.js index 731891d40dbfef53e05866b4f189467c2229a84f..82366cfb28bd8b469a6fb50da57bb8b95affa0d3 100644 --- a/src/player/electiveSurgery.js +++ b/src/player/electiveSurgery.js @@ -3174,6 +3174,9 @@ App.UI.electiveSurgery = function() { V.PC.preg = 0; V.PC.ovaImplant = 0; V.PC.wombImplant = "none"; + if (V.menstruation === 1) { + V.PC.fertPeak = 1; + } cashX(forceNeg(50000), "PCmedical"); }))); return el; @@ -3190,6 +3193,9 @@ App.UI.electiveSurgery = function() { el.append(App.UI.DOM.makeElement("div", surgeryLink("Fix your fertility concerns", "replaceOvaries", () => { healthDamage(V.PC, 10); V.PC.preg = 0; + if (V.menstruation === 1) { + V.PC.fertPeak = 1; + } cashX(forceNeg(applyDiscount(500)), "PCmedical"); }))); return el; @@ -3213,6 +3219,9 @@ App.UI.electiveSurgery = function() { V.PC.eggType = "human"; V.PC.ovaImplant = 0; V.PC.wombImplant = "none"; + if (V.menstruation === 1) { + V.PC.fertPeak = 1; + } cashX(forceNeg(50000), "PCmedical"); }))); } @@ -3233,6 +3242,9 @@ App.UI.electiveSurgery = function() { V.PC.ovaries = 1; V.PC.preg = 0; V.PC.eggType = "human"; + if (V.menstruation === 1) { + V.PC.fertPeak = 1; + } cashX(forceNeg(50000), "PCmedical"); })); el.append(App.UI.DOM.makeElement("div", App.UI.DOM.generateLinksStrip(linkArray)));