diff --git a/js/medicine/surgery/genitals/vagina.js b/js/medicine/surgery/genitals/vagina.js index facb07fdf72b18f5b18554f83a717d7de8f54eb2..59670033abbb2895ed0cbf57dd3cd51a20515119 100644 --- a/js/medicine/surgery/genitals/vagina.js +++ b/js/medicine/surgery/genitals/vagina.js @@ -88,6 +88,8 @@ App.Medicine.Surgery.Procedures.RestoreVirginity = class extends App.Medicine.Su apply(cheat) { this._slave.vagina = 0; + this._slave.counter.reHymen = this._slave.counter.reHymen ? this._slave.counter.reHymen + 1 : 1; + this._slave.trueVirgin = 0; return this._assemble(new App.Medicine.Surgery.Reactions.Vagina()); } }; diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js index 0e28da4fc554e4124342d713bf0bcc5b4af31bf2..21099a2a89cdfa0edabb61588649fa6e2d0ed7fa 100644 --- a/src/002-config/fc-version.js +++ b/src/002-config/fc-version.js @@ -2,5 +2,5 @@ App.Version = { base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed. pmod: "4.0.0-alpha.26", commitHash: null, - release: 1199, // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js. + release: 1200, // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js. }; diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js index 38db8b14537090775b60512bfdbd50b3b2e09048..29de7c69fa552f95f79412a77fd7dc2d4a2967d9 100644 --- a/src/js/SlaveState.js +++ b/src/js/SlaveState.js @@ -346,6 +346,8 @@ App.Entity.SlaveActionsCountersState = class { this.timesBred = 0; /** How many of your children has she borne. */ this.PCChildrenBeared = 0; + /** How many times her hymen has been reconstructed */ + this.reHymen = 0; } }; diff --git a/src/js/rulesAutosurgery.js b/src/js/rulesAutosurgery.js index 06eaddbf73fb5d937155a664f58c9d2043048a1c..349f89b2d7e2dedffec287f3b4718a16255456c0 100644 --- a/src/js/rulesAutosurgery.js +++ b/src/js/rulesAutosurgery.js @@ -265,6 +265,8 @@ globalThis.rulesAutosurgery = (function() { } else if (slave.vagina > 0 && V.surgeryUpgrade === 1 && thisSurgery.holes === 2) { commitProcedure("a virgin pussy", () => { slave.vagina = 0; + slave.trueVirgin = 0; + slave.counter.reHymen = slave.counter.reHymen ? slave.counter.reHymen + 1 : 1; if (slave.skill.vaginal > 10) { slave.skill.vaginal -= 10; } diff --git a/src/npc/interaction/fSuckDick.js b/src/npc/interaction/fSuckDick.js index f6b16e5ae59cef2db4d149abbe00e2d764a318c7..b614269613536d0a7e9393e3002823818a591095 100644 --- a/src/npc/interaction/fSuckDick.js +++ b/src/npc/interaction/fSuckDick.js @@ -803,6 +803,8 @@ App.Interact.fSuckDick = function(slave) { break; case "work as a nanny": text.push(`hurries off to clean ${himself} before heading back to the ${V.nurseryName}.`); + default: + text.push(`hurries off to clean ${himself}.`); } } diff --git a/src/player/electiveSurgery.js b/src/player/electiveSurgery.js index 649debccc9a751b5f4773008361e64a8896abc4c..a2d26cedbd2b836d9ff4f19712a6de88370c3fcd 100644 --- a/src/player/electiveSurgery.js +++ b/src/player/electiveSurgery.js @@ -704,16 +704,79 @@ App.UI.electiveSurgery = function() { function vagina() { const p = document.createElement("p"); const r = []; + const linkArray = []; if (V.PC.vagina >= 3 && V.PC.newVag === 0) { - r.push(`"Looking a little loose down there; I can fix that for you. Get you nice and tight again. Oh, and our pussies are guaranteed to not lose their tightness, or your money back! <span class="cash">${cashFormat(applyDiscount(15000))}</span> for a brand new vagina."`); - App.Events.addNode(p, r, "div"); - p.append(App.UI.DOM.makeElement("div", surgeryLink("Get a tighter vagina", "tightPussy", () => { + r.push(`"Looking a little loose down there; I can fix that for you. Get you nice and tight again. Oh, and our pussies are guaranteed to not lose their tightness, or your money back! <span class="cash">${cashFormat(applyDiscount(15000))}</span> for a brand new vagina. ${V.PC.preg < 1 ? "I can even do a hymen reconstruction if you want. Nobody will notice that your vagina has already been used, it will be a perfect work of craftsmanship" : "If you weren't pregnant, I could give you a hymen reconstruction, think about it for when you have your uterus free"}. It costs <span class="cash">${cashFormat(applyDiscount(2000))}</span> more."`); + if (V.PC.degeneracy > 0) { + r.push(`${HeU} thinks for a moment and adds: "The advantage of having an intact hymen is that ${V.doctor.state > 0 ? "your" : "a renowned "} doctor can certify your virginity: this will help to reduce the rumors about you. It will cost you another <span class="cash">${cashFormat(applyDiscount(2000))}</span>, but it is worth it."`); + } + linkArray.push(surgeryLink("Get a tighter vagina", "tightPussy", () => { V.PC.vagina = 1; V.PC.newVag = 1; cashX(forceNeg(applyDiscount(15000)), "PCmedical"); - }))); + })); + if (V.PC.preg === 0) { + linkArray.push(surgeryLink("Get a tight virgin vagina", "tightPussy", () => { + V.PC.vagina = 0; + V.PC.newVag = 1; + V.PC.trueVirgin = 0; + V.PC.counter.reHymen = V.PC.counter.reHymen ? V.PC.counter.reHymen + 1 : 1; + if (V.PC.degeneracy > 0) { + cashX(forceNeg(applyDiscount(19000)), "PCmedical"); + } else { + cashX(forceNeg(applyDiscount(17000)), "PCmedical"); + } + })) + }; + } else if (V.PC. vagina > 0) { + if (V.PC.preg === 0) { + r.push(`"It looks like you have lost the warranty seal${V.PC.counter.reHymen ? " again" : ""}. I can give you a hymen reconstruction for only <span class="cash">${cashFormat(applyDiscount(2000))}</span>. No one will notice that your vagina has ${V.PC.counter.vaginal/V.week > 10 ? "largely" : ""} been used${V.raped > 0 ? " and abused" : ""}, it will be a perfect work of craftsmanship. The surgery will also serve to make your duct narrow like"`); + if (V.PC.physicalAge < 13 || V.PC.actualAge < 13) { + r.push("a child like you is supposed to have."); + } else if (V.PC.visualAge < 13) { + r.push("the child you look like is supposed to have."); + } else if (!V.PC.pubertyXX) { + r.push(`a prepubescent ${V.PC.genes === "XX" ? "girl" : "boy with vagina"} like you is supposed to have.`); + } else if (V.PC.genes === "XX") { + r.push("as you had it at birth."); + } else { + r.push("that of a preteen girl."); + } + if (V.PC.degeneracy > 0) { + r.push(`${HeU} thinks for a moment and adds: "The advantage of having an intact hymen is that ${V.doctor.state > 0 ? "your" : "a renowned "} doctor can certify your virginity: this will help to reduce the rumors about you. It will cost you <span class="cash">${cashFormat(applyDiscount(2000))}</span> more, but it is worth it."`); + } + linkArray.push(surgeryLink("Get your hymen restored", "reVirgin", () => { + V.PC.vagina = 0; + V.PC.trueVirgin = 0; + V.PC.counter.reHymen = V.PC.counter.reHymen ? V.PC.counter.reHymen + 1 : 1; + if (V.PC.degeneracy > 0) { + cashX(forceNeg(applyDiscount(4000)), "PCmedical"); + } else { + cashX(forceNeg(applyDiscount(2000)), "PCmedical"); + } + })); + } else { + r.push(`"It looks like you have lost the warranty seal${V.PC.counter.reHymen ? " again" : ""}. If you weren't pregnant, I could give you a hymen reconstruction for only <span class="cash">${cashFormat(applyDiscount(2000))}</span>. No one would notice that your vagina has ${V.PC.counter.vaginal/V.week > 10 ? "largely" : ""} been used${V.raped > 0 ? " and abused" : ""}, it would be a perfect work of craftsmanship. The surgery would also serve to make your duct narrow like"`); + if (V.PC.physicalAge < 13 || V.PC.actualAge < 13) { + r.push("a child like you is supposed to have."); + } else if (V.PC.visualAge < 13) { + r.push("the child you look like is supposed to have."); + } else if (!V.PC.pubertyXX) { + r.push(`a prepubescent ${V.PC.genes === "XX" ? "girl" : "boy with vagina"} like you is supposed to have.`); + } else if (V.PC.genes === "XX") { + r.push("as you had it at birth."); + } else { + r.push("that of a preteen girl."); + } + if (V.PC.degeneracy > 0) { + r.push(`${HeU} thinks for a moment and adds: "The advantage of having an intact hymen is that ${V.doctor.state > 0 ? "your" : "a renowned "} doctor can certify your virginity: this would help to reduce the rumors about you. It would cost you <span class="cash">${cashFormat(applyDiscount(2000))}</span> more, but it is worth it."`); + } + r.push(`${He} makes a resigned face and tells you "Come back when you're not pregnant if you're interested."`) + } } + App.Events.addNode(p, r, "div"); + p.append(App.UI.DOM.makeElement("div", App.UI.DOM.generateLinksStrip(linkArray))); el.append(p); } @@ -721,7 +784,7 @@ App.UI.electiveSurgery = function() { const p = document.createElement("p"); const r = []; if (V.PC.preg === -2 && V.PC.physicalAge < 70) { - r.push(`Now we can only do this so many times before your body just can't handle it, but if you absolutely must have a child with your, um, vintage, then we can do something for you. For <span class="cash">${cashFormat(50000)},</span> we can clone and replace your depleted ovaries with slightly younger ones. They'll get you a couple more years of ovulation before they dry up too, but if you're desperate for a child, they may be your last option.`); + r.push(`"Now we can only do this so many times before your body just can't handle it, but if you absolutely must have a child with your, um, vintage, then we can do something for you. For <span class="cash">${cashFormat(50000)},</span> we can clone and replace your depleted ovaries with slightly younger ones. They'll get you a couple more years of ovulation before they dry up too, but if you're desperate for a child, they may be your last option."`); App.Events.addNode(p, r, "div"); p.append(App.UI.DOM.makeElement("div", surgeryLink("Regenerate your ovaries and cheat menopause for a couple more years", "ovulationRestart", () => { V.PC.ovaryAge = 45; diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js index 69b54359cc484b3f615db634b944eeeb85c4599d..9cdbea311017f3b60767c2f3f5617950cf3eef82 100644 --- a/src/player/js/PlayerState.js +++ b/src/player/js/PlayerState.js @@ -140,6 +140,9 @@ App.Entity.PlayerActionsCountersState = class { this.pitWins = 0; /** number of fights lost */ this.pitLosses = 0; + /** number of hymen reconstructions */ + this.reHymen = 0; + /** content for pInsemination */ this.moves = 0; diff --git a/src/player/pcSurgeryDegradation.js b/src/player/pcSurgeryDegradation.js index 523c89ad7f101fad94c62294b27f2c0c24b84804..8ccdda22f06be5c819c9077f17b5139ccc1179c1 100644 --- a/src/player/pcSurgeryDegradation.js +++ b/src/player/pcSurgeryDegradation.js @@ -448,9 +448,69 @@ App.UI.PCSurgeryDegradation = function(surgeryType) { } else if (V.PC.belly >= 10000) { r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`); } else { - r.push(`find your pussy is much tighter than it was. No hymen though, so you can't pass as a virgin.`); + r.push(`find your pussy is much tighter than it was.${V.PC.vagina > 0 ? " No hymen though, so you can't pass as a virgin." : ""}`); } - r.push(`"So, do you like it? Does it feel any tighter?", asks the surgeon's assistant, seating ${himselfU} beside you and tracing your labia with a finger. "Feel anything? Or do we need to take this a little further?" ${HeU} begins fingering your new pussy, feeling around for any oddities and teasing you at the same time. "I know you're still a little sore, but bear with it. Plus, I know it must feel good.`); + if (V.PC.vagina === 0) { + r.push(` You carefully put a finger into your pussy and notice a barrier before you manage to insert the second knuckle. You try to push a little further and you feel a pressure inside you. Indeed, you are a virgin again and you have a tight vagina, like new.`) + } + r.push(`"So, do you like it? Does it feel any tighter?", asks the surgeon's assistant, seating ${himselfU} beside you and tracing your labia with a finger. "Feel anything? Or do we need to take this a little further?" ${HeU} begins ${V.PC.vagina > 0 ?"fingering your new pussy" : "playing with the tip of the finger in your vulvar vestibule"}, feeling around for any oddities and teasing you at the same time. "I know you're still a little sore, but bear with it. Plus, I know it must feel good.`); + if (V.PC.dick !== 0) { + r.push(`See? He agrees with me," ${heU} says, poking at the tip of your erection with ${hisU} free hand. "Shall we see if it's working right?" ${HeU} circles around till ${heU} is between your legs and`); + if (V.PC.belly >= 10000) { + r.push(`disappears behind the curvature of your pregnancy.`); + } else { + r.push(`disappears between your thighs.`); + } + r.push(`You feel`); + if (V.PC.balls >= 9) { + r.push(`${himU} lift your engorged sack and leave it resting atop ${hisU} head`); + } else { + r.push(`${hisU} head brush against your sack`); + } + r.push(`as ${heU} brings ${hisU} mouth to your cunt and begins to enthusiastically eat you out.`); + if (V.PC.vagina === 0) { + r.push(`${HisU} long tongue enters your vagina and you feel ${heU} rhythmically pressing into your new hymen with just enough pressure for you to feel it.`); + } + r.push(`${HeU} is quite good at ${hisU} job and quickly brings you to climax; your neglected dick spraying cum across your belly. ${HeU} rises from your crotch to lick up your wayward cum. "I always did like the taste of you. Feel free to rest as long as you need before departing.`); + if (V.PC.degeneracy > 0) { + r.push(`Ah, I forgot, while you were sedated ${V.doctor.state > 0 ? "your" : "a renowned "} doctor came, did an examination, issued a virginity certificate and made a public declaration that you are a virgin.`); + V.PC.degeneracy = Math.max(V.PC.degeneracy, 0); + if (V.PC.degeneracy > 0) { + V.PC.degeneracy = Math.floor(V.PC.degeneracy / 2); + if (V.PC.degeneracy >= 100) { + V.PC.degeneracy = Math.min(50 + Math.floor(V.PC.degeneracy / 3), 99); + } + } + } + r.push(`If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology.`); + } else { + r.push(`See? Your cute little clit agrees with me," ${heU} says, poking at the tip of your peeking clit with ${hisU} free hand. "Shall we see if it's working right?" ${HeU} circles around till ${heU} is between your legs and`); + if (V.PC.belly >= 10000) { + r.push(`disappears behind the curvature of your pregnancy.`); + } else { + r.push(`disappears between your thighs.`); + } + r.push(`You feel ${hisU} face brush your inner legs as ${heU} brings ${hisU} mouth to your cunt and begins to enthusiastically eat you out.`); + if (V.PC.vagina === 0) { + r.push(`${HisU} long tongue enters your vagina and you feel ${heU} rhythmically pressing into your new hymen with just enough pressure for you to feel it.`); + } + r.push(`${HeU} is quite good at ${hisU} job and quickly brings you to climax; your new${V.PC.vagina === 0 ? " virgin" : ""} pussy squirting girlcum across ${hisU} face. ${HeU} rises from your crotch and licks ${hisU} lips. "I always did like the taste of you. Feel free to rest as long as you need before departing.`); + if (V.PC.degeneracy > 0 && V.PC.vagina === 0) { + r.push(`Ah, I forgot, ${V.doctor.state > 0 ? "your" : "a renowned "} doctor came while you were sedated, did an examination, issued a virginity certificate and <span class="rep inc">made a public statement that you are a virgin</span>.`); + V.PC.degeneracy = Math.max(V.PC.degeneracy - 10, 0); /** -10 points */ + if (V.PC.degeneracy > 0) { + V.PC.degeneracy = V.PC.degeneracy - Math.max(Math.floor(V.PC.degeneracy / 2), 50); /** reduces half of the points from 11 to 60 */ + if (V.PC.degeneracy > 50) { + V.PC.degeneracy = Math.min(50 + Math.floor((V.PC.degeneracy - 50) / 3), 99); /** reduces 2/3 of the points from 61 to 99, caps at 99 */ + } + } + } + r.push(`If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology.`); + } + break; + case "reVirgin": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs. You pull the covers off of yourself to catch sight of the result of the surgery. You spread your legs and push your labia apart to try to see your insides in the ceiling mirror, but your vaginal opening is now too small and the mirror is far away. You carefully put a finger into your pussy and notice a barrier before you manage to insert the second knuckle. You try to push a little further and you feel a pressure inside you. Indeed, you are a virgin again and you have a tight vagina, like new.`); + r.push(`"So, do you feel it? Does it feel tight?", asks the surgeon's assistant, seating ${himselfU} beside you and tracing your labia with a finger. "May I?" ${HeU} asks you, teasing your vaginal entrance. ${HeU} doesn't wait for your answer and inserts the tip of ${hisU} finger, proving around for any oddities and teasing you at the same time. "I know you're still a little sore, but bear with it. Plus, I know it must feel good.`); if (V.PC.dick !== 0) { r.push(`See? He agrees with me," ${heU} says, poking at the tip of your erection with ${hisU} free hand. "Shall we see if it's working right?" ${HeU} circles around till ${heU} is between your legs and`); if (V.PC.belly >= 10000) { @@ -464,7 +524,7 @@ App.UI.PCSurgeryDegradation = function(surgeryType) { } else { r.push(`${hisU} head brush against your sack`); } - r.push(`as ${heU} brings ${hisU} mouth to your cunt and begins to enthusiastically eat you out. ${HeU} is quite good at ${hisU} job and quickly brings you to climax; your neglected dick spraying cum across your belly. ${HeU} rises from your crotch to lick up your wayward cum. "I always did like the taste of you. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology.`); + r.push(`as ${heU} brings ${hisU} mouth to your cunt and begins to enthusiastically eat you out. ${HisU} long tongue enters your vagina and you feel ${heU} rhythmically pressing into your new hymen with just enough pressure for you to feel it. ${HeU} is quite good at ${hisU} job and quickly brings you to climax; your neglected dick spraying cum across your belly. ${HeU} rises from your crotch to lick up your wayward cum. "I always did like the taste of you. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology.`); } else { r.push(`See? Your cute little clit agrees with me," ${heU} says, poking at the tip of your peeking clit with ${hisU} free hand. "Shall we see if it's working right?" ${HeU} circles around till ${heU} is between your legs and`); if (V.PC.belly >= 10000) { @@ -472,7 +532,18 @@ App.UI.PCSurgeryDegradation = function(surgeryType) { } else { r.push(`disappears between your thighs.`); } - r.push(`You feel face brush your inner legs as ${heU} brings ${hisU} mouth to your cunt and begins to enthusiastically eat you out. ${HeU} is quite good at ${hisU} job and quickly brings you to climax; your new pussy squirting girlcum across ${hisU} face. ${HeU} rises from your crotch and licks ${hisU} lips. "I always did like the taste of you. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology.`); + r.push(`You feel ${hisU} face brush your inner legs as ${heU} brings ${hisU} mouth to your cunt and begins to enthusiastically eat you out. ${HisU} long tongue enters your vagina and you feel ${heU} rhythmically pressing into your new hymen with just enough pressure for you to feel it. ${HeU} is quite good at ${hisU} job and quickly brings you to climax; your virgin pussy squirting girlcum across ${hisU} face. ${HeU} rises from your crotch and licks ${hisU} lips. "I always did like the taste of you. Feel free to rest as long as you need before departing.`); + if (V.PC.degeneracy > 0 && V.PC.vagina === 0) { + r.push(`Ah, I forgot, ${V.doctor.state > 0 ? "your" : "a renowned "} doctor came while you were sedated, did an examination, issued a virginity certificate and <span class="rep inc">made a public statement that you are a virgin</span>.`); + V.PC.degeneracy = Math.max(V.PC.degeneracy - 10, 0); /** -10 points */ + if (V.PC.degeneracy > 0) { + V.PC.degeneracy = V.PC.degeneracy - Math.max(Math.floor(V.PC.degeneracy / 2), 50); /** reduces half of the points from 11 to 60 */ + if (V.PC.degeneracy > 50) { + V.PC.degeneracy = Math.min(50 + Math.floor((V.PC.degeneracy - 50) / 3), 99); /** reduces 2/3 of the points from 61 to 99, caps at 99 */ + } + } + } + r.push(`If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology.`); } break; case "herm2female":