From 7f59a7cd1ec9244fd05eb7206648b0b8eea224bb Mon Sep 17 00:00:00 2001 From: LollipopScythe <11764-LollipopScythe@users.noreply.gitgud.io> Date: Sat, 10 Dec 2022 10:25:18 +0000 Subject: [PATCH] More Pregnancy Changes --- game/03-JavaScript/04-Pregnancy/pregnancy.js | 430 ++++++++++++++---- .../04-Pregnancy/storyFunctions.js | 75 +-- .../04-Variables/variables-versionUpdate.twee | 5 + game/base-combat/ejaculation-eden.twee | 14 + game/base-combat/ejaculation-gloryhole.twee | 7 + game/base-combat/ejaculation-kylar.twee | 14 + game/base-combat/ejaculation-leighton.twee | 14 + game/base-combat/ejaculation-pillory.twee | 9 + game/base-combat/ejaculation-robin.twee | 2 + game/base-combat/ejaculation-sydney.twee | 9 + game/base-combat/ejaculation-wall.twee | 9 + game/base-combat/ejaculation.twee | 22 +- game/base-system/named-npcs.twee | 6 +- .../base-system/overlays/characteristics.twee | 22 +- game/base-system/physicalAdjustments.twee | 4 +- game/base-system/pregnancy/events.twee | 2 +- game/base-system/pregnancy/pregnancy.twee | 140 +----- game/base-system/settings.twee | 2 +- game/base-system/time.twee | 5 + game/base-system/widgets.twee | 4 + game/overworld-town/loc-home/pills.twee | 29 +- modules/css/base.css | 7 +- 22 files changed, 552 insertions(+), 279 deletions(-) diff --git a/game/03-JavaScript/04-Pregnancy/pregnancy.js b/game/03-JavaScript/04-Pregnancy/pregnancy.js index e86fffa909..8e09674799 100644 --- a/game/03-JavaScript/04-Pregnancy/pregnancy.js +++ b/game/03-JavaScript/04-Pregnancy/pregnancy.js @@ -59,20 +59,62 @@ window.spermObjectToArray = (spermObject = {}) => { if(!trackedNPCs.includes(npc)) trackedNPCs.push([spermType, npc]); let count = sperm.count.length < 500 ? sperm.count.length : 500; for(let i = 0; i < count; i++){ + if(sperm.count[i][2] < random(0,100)) continue; let count2 = sperm.count[i][1] < 500 ? sperm.count[i][1] : 500; for(let j = 0; j < count2; j++){ spermArray.push([sperm.type, npc]); + if(sperm.count[i][2] > random(100,200)) spermArray.push([sperm.type, npc]); } } } return [trackedNPCs, spermArray]; } +/*V.pregnancytype === "fetish" uses this function*/ +const fetishPregnancy = ({genital = "vagina", target = null, spermOwner = null, spermType, rngModifier = 100, quantity = 1}) => { + let motherObject = npcPregObject(target); + const [pregnancy, fertility, magicTattoo] = pregPrep({motherObject, genital}); + + //Check the cycle settings + let multi = 1; + if(V.cycledisable === "f"){ + if(target === "pc"){ + let menstruation = V.sexStats.vagina.menstruation; + if(menstruation.currentState !== "normal") return null; + let diff = Math.abs(menstruation.stages[2] - menstruation.currentDay); + multi = Math.clamp((diff > 1 ? 1 - (diff * 0.15) : 1),0,1); + } else if(C.npc[target]){ + let diff = Math.abs(pregnancy.cycleDangerousDay - pregnancy.cycleDay); + multi = Math.clamp((diff > 1 ? 1 - (diff * 0.15) : 1),0,1); + } + } else { + //Other non-cycle modifiers + } + + if(pregnancy && pregnancy.type === null){ + let chance = 100 / (target === "pc" ? 100 - V.baseVaginalPregnancyChance : 20 - V.baseNpcPregnancyChance); + + if(chance * quantity * (rngModifier / 100) * (1 + fertility + magicTattoo) * multi < random(1,100) - 15) return false; + + if(target === "pc"){ + let result = playerPregnancy(spermOwner, spermType, true, genital, undefined, true); + if(result === true) T.playerIsPregnant = true; + }else if(C.npc[target]){ + let result = namedNpcPregnancy(target, spermOwner, spermType, true); + if(result === true) T.npcIsPregnant = true; + } + return true; + } + return false; +} + +/*Player pregnancy starts here */ /*ToDo: Pregnancy - remove the ` || !V.pregnancyTesting` part of the check*/ +/*V.pregnancytype === "realistic" uses this function*/ const playerPregnancyAttempt = (baseMulti = 1, genital = "vagina") => { - let pregnancy = clone(V.sexStats[genital].pregnancy); + let pregnancy = V.sexStats[genital].pregnancy; - if(pregnancy.fetus.length || isNaN(baseMulti) || baseMulti < 1 || !V.pregnancyTesting) return false; + if(pregnancy.fetus.length || isNaN(baseMulti) || baseMulti < 1 || !V.pregnancyTesting || V.pregnancytype !== "realistic") return false; let [trackedNPCs, spermArray] = spermObjectToArray(V.sexStats[genital].sperm); @@ -102,29 +144,33 @@ const playerPregnancyAttempt = (baseMulti = 1, genital = "vagina") => { DefineMacro("playerPregnancyAttempt", playerPregnancyAttempt); window.playerPregnancyAttemptTest = (baseMulti, genital) => {if(V.pregnancyTesting) return playerPregnancyAttempt(baseMulti, genital);};//V.pregnancyTesting Check should not be removed, debugging purposes only -const playerPregnancy = (npc, npcType, fatherKnown = false, genital = "vagina", trackedNPCs) => { +const playerPregnancy = (npc, npcType, fatherKnown = false, genital = "vagina", trackedNPCs, awareOf = false) => { let pregnancy = clone(V.sexStats[genital].pregnancy); let newPregnancy; + let backupSpermType; switch(npcType){ case "human": newPregnancy = pregnancyGenerator.human("pc", npc, fatherKnown, genital); + backupSpermType = "human"; break; case "wolf": newPregnancy = pregnancyGenerator.wolf("pc", npc, fatherKnown, genital); + backupSpermType = "wolf"; break; case "wolfboy": case "wolfgirl": newPregnancy = pregnancyGenerator.wolf("pc", npc, fatherKnown, genital, true); + backupSpermType = "wolf"; break; } if(newPregnancy && !(typeof newPregnancy === 'string' || newPregnancy instanceof String) && newPregnancy.fetus.length){ V.sexStats[genital].pregnancy = { ...pregnancy, ...newPregnancy, - potentialFathers: trackedNPCs || [npc], + potentialFathers: trackedNPCs || [[backupSpermType,npc]], waterBreakingTimer: random(0,24), waterBreaking: false, - awareOf: false, + awareOf: awareOf, } V.sexStats.vagina.menstruation.currentState = "pregnant"; return true; @@ -132,8 +178,146 @@ const playerPregnancy = (npc, npcType, fatherKnown = false, genital = "vagina", return false; } DefineMacro("playerPregnancy", playerPregnancy); -window.playerPregnancyTest = (npc, npcType, fatherKnown, genital, trackedNPCs) => {if(V.pregnancyTesting) return playerPregnancy(npc, npcType, fatherKnown, genital, trackedNPCs);};//V.pregnancyTesting Check should not be removed, debugging purposes only +window.playerPregnancyTest = (npc, npcType, fatherKnown, genital, trackedNPCs, awareOf) => {if(V.pregnancyTesting) return playerPregnancy(npc, npcType, fatherKnown, genital, trackedNPCs, awareOf);};//V.pregnancyTesting Check should not be removed, debugging purposes only + +const pregnancyProgress = (genital = "vagina") => { + let pregnancy = V.sexStats[genital].pregnancy; + if(!pregnancy || pregnancy.type === null || pregnancy.type === "parasites") return null; + + if(pregnancy.timer < pregnancy.timerEnd){ + let multiplier = 1; + switch(pregnancy.type){ + case "human": multiplier = (1/(1/9*V.humanPregnancyMonths)); break; + case "wolf": multiplier = (1/(1/12*V.wolfPregnancyWeeks)); break; + } + //The `0.5 * ` is because it runs at both midnight and noon + pregnancy.timer += parseFloat((0.5 * multiplier).toFixed(3)); + + /*Keeping fatigue low should help morning sickness*/ + if(between(pregnancy.timer / pregnancy.timerEnd, 0.15, 0.25)){ + /*Early Morning sickness*/ + /*Light Nausea/dizzyness at any time of day, but mostly when waking up*/ + if(random(0,100) >= 30){ + V.pregnancyStats.morningSicknessWaking = 1; + } + if(random(0,100) >= 30){ + V.pregnancyStats.morningSicknessGeneral = 1; + } + } else if(between(pregnancy.timer / pregnancy.timerEnd, 0.24, 0.45)){ + /*Morning sickness*/ + /*Nausea/dizzyness at any time of day, but mostly when waking up*/ + /*First pregnancy should be worse*/ + V.pregnancyStats.morningSicknessWaking = [1,2,2][random(0,2)]; + if(pregnancy.totalBirthEvents === 0 && V.pregnancyStats.morningSicknessWaking < 2){ + V.pregnancyStats.morningSicknessWaking = 2; + } + } + if(pregnancy.timer >= pregnancy.timerEnd){ + if(V.player.breastsize <= 4 && V.player.breastsize < V.breastsizemax){ + V.player.breastsize += 1; + if(V.player.breastsize <= 4 && V.player.breastsize < V.breastsizemax) V.player.breastsize += 1; + V.breastgrowthtimer = 700; + V.breastgrowthmessage = V.player.breastsize; + V.effectsmessage = 1; + } + if(V.lactating !== 1 && V.player.breastsize > 0){ + V.lactating = 1; + V.lactation_pressure = 100; + Wikifier.wikifyEval('<<milkvolume 50>>'); + V.effectsmessage = 1; + V.lactationmessage = 1; + } + } + } +} +DefineMacro("pregnancyProgress",pregnancyProgress); + +const playerEndWaterProgress = (genital = "vagina") => { + let pregnancy = V.sexStats[genital].pregnancy; + if(!pregnancy || pregnancy.type === null || pregnancy.type === "parasites" || pregnancy.timer < pregnancy.timerEnd) return null; + + if(!isNaN(pregnancy.waterBreakingTimer) && pregnancy.waterBreakingTimer > 0){ + pregnancy.waterBreakingTimer--; + if(pregnancy.waterBreakingTimer <= 0){ + pregnancy.waterBreaking = true; + return true; + } + return false; + } +} +DefineMacro("playerEndWaterProgress", playerEndWaterProgress); + +//Used only when the player is about to give birth to their children and the player can name them +const playerEndWaterBreaking = () => { + V.sexStats.vagina.pregnancy.waterBreaking = null; + V.sexStats.vagina.pregnancy.waterBreakingTimer = null; + V.sexStats.anus.pregnancy.waterBreaking = null; + V.sexStats.anus.pregnancy.waterBreakingTimer = null; +} +DefineMacro("playerEndWaterBreaking", playerEndWaterBreaking); + +const endPlayerPregnancy = (location) => { + let type; + if(V.player.vaginaExist){ + type = "vagina"; + }else{ + type = "anus"; + } + let pregnancy = V.sexStats[type].pregnancy; + let menstruation = V.sexStats.vagina.menstruation; + + if(!pregnancy || !pregnancy.fetus.length) return false; + + giveBirthToChildren("pc", location); + + if(pregnancy.potentialFathers.filter(npc => npc[0] === pregnancy.type).length >= 5) Wikifier.wikifyEval('<<earnFeat "Bicycle Mother">>'); + switch(pregnancy.type){ + case "human": + V.pregnancyStats.humanToysUnlocked = true; + menstruation.recoveryTime = random(2,3) * V.humanPregnancyMonths; + if(pregnancy.fetus.length === 3) Wikifier.wikifyEval('<<earnFeat "Life Comes in Threes">>'); + break; + case "wolf": + V.pregnancyStats.wolfToysUnlocked = true; + menstruation.recoveryTime = random(1,2) * V.wolfPregnancyWeeks; + break; + } + let birthEvents = clone(pregnancy.totalBirthEvents || 0) + 1; + + if((V.player.virginity.anal === true && !V.player.vaginaExist) || (V.player.virginity.vaginal === true && V.player.vaginaExist)) Wikifier.wikifyEval('<<earnFeat "Miracle of Life">>'); + if(!V.player.vaginaExist) Wikifier.wikifyEval('<<earnFeat "Life begins when you least expect">>'); + + V.sexStats[type].pregnancy = { + ...pregnancy, + totalBirthEvents: birthEvents, + fetus: [], + waterBreaking: false, + waterBreakingTimer: null, + type: null, + bellySize: 0, + timer: null, + timerEnd: null, + awareOf: null, + awareOfDetails: null, + potentialFathers: [], + } + + V.sexStats.vagina.menstruation = { + ...menstruation, + currentState: "recovering", + recoveryTimeStart: menstruation.recoveryTime, + recoveryStage: 0, + periodEnabled: false, + awareOfPeriodDelay: false, + } + return true; +} +DefineMacro("endPlayerPregnancy", endPlayerPregnancy); +window.endPlayerPregnancyTest = (location) => {if(V.pregnancyTesting && location) return endPlayerPregnancy(location);};//V.pregnancyTesting Check should not be removed, debugging purposes only +/*Player pregnancy ends here */ + +/*Named NPC pregnancy starts here*/ /*ToDo: NPC Pregnancy - run in time.twee, should only run once per day, update where required*/ const npcPregnancyCycle = () => { for(const npcName in V.NPCNameList){ @@ -160,21 +344,23 @@ const npcPregnancyCycle = () => { pregnancy.waterBreaking = true; } } - } else if(pregnancy.enabled && V.npcPregnancyDisable === "f") { + } else if(pregnancy.enabled && V.npcPregnancyDisable === "f" && V.cycledisable === "f") { pregnancy.cycleDay++; if(pregnancy.cycleDay >= pregnancy.cycleDaysTotal){ pregnancy.cycleDay = 1; } else if(between(pregnancy.cycleDay, pregnancy.cycleDangerousDay - 1, pregnancy.cycleDangerousDay + 1)){ - npcPregnancyAttempt(npcName); + namedNpcPregnancyAttempt(npcName); } } + updateRecordedSperm("vagina", npcName, 1); } } +DefineMacro("npcPregnancyCycle", npcPregnancyCycle); +/*V.pregnancytype === "realistic" uses this function*/ const namedNpcPregnancyAttempt = (npcName) => { - if(!C.npc[npcName] || C.npc[npcName].vagina === "none"){ - return false; - } + if(!C.npc[npcName] || C.npc[npcName].vagina === "none" || V.pregnancytype !== "realistic") return false; + let namedNpc = C.npc[npcName]; let pregnancy = namedNpc.pregnancy; if(pregnancy || !pregnancy.enabled || pregnancy.fetus.length){ @@ -199,93 +385,49 @@ const namedNpcPregnancyAttempt = (npcName) => { return false; } -const namedNpcPregnancy = (mother, father, pregnancyType, fatherKnown = false, trackedNPCs) => { +const namedNpcPregnancy = (mother, father, fatherSpecies, fatherKnown = false, trackedNPCs, awareOf = false) => { let namedNpc = C.npc[mother]; + let namedNpcType; + switch(mother){ + case "Black Wolf": + if((V.monsterchance > random(0,100) && (V.hallucinations >= 1 || V.monsterhallucinations === "f")) || (V.blackwolfmonster === 2)){ + namedNpcType = "wolfgirl"; + }else{ + namedNpcType = namedNpc.type; + } + break; + default: namedNpcType = namedNpc.type; break; + } let newPregnancy; - switch(pregnancyType){ - case "human": + let backupSpermType; + switch(fatherSpecies + namedNpcType){ + case "humanhuman": newPregnancy = pregnancyGenerator.human(mother, father, fatherKnown, "vagina"); + backupSpermType = "human"; break; - case "wolf": + case "wolfhuman": case "humanwolf": case "wolfwolf": newPregnancy = pregnancyGenerator.wolf(mother, father, fatherKnown, "vagina"); + backupSpermType = "wolf"; break; - case "wolfboy": case "wolfgirl": + case "humanwolfboy": case "wolfboyhuman": case "wolfwolfboy": case "wolfboywolf": case "wolfboywolfboy": case "humanwolfgirl": case "wolfgirlhuman": case "wolfwolfgirl": case "wolfgirlwolf": case "girlwolfgirlwolf": newPregnancy = pregnancyGenerator.wolf(mother, father, fatherKnown, "vagina", true); + backupSpermType = "wolf"; break; } if(newPregnancy && !(typeof newPregnancy === 'string' || newPregnancy instanceof String) && newPregnancy.fetus.length){ namedNpc.pregnancy = { ...namedNpc.pregnancy, ...newPregnancy, - potentialFathers: trackedNPCs || [father], + potentialFathers: trackedNPCs || [[backupSpermType,father]], npcAwareOf: false, - pcAwareOf: false, + pcAwareOf: awareOf, } return true; } return false; } DefineMacro("namedNpcPregnancy", namedNpcPregnancy); -window.namedNpcPregnancyTest = (mother, father, pregnancyType, fatherKnown, trackedNPCs) => {if(V.pregnancyTesting) return namedNpcPregnancy(mother, father, pregnancyType, fatherKnown, trackedNPCs);};//V.pregnancyTesting Check should not be removed, debugging purposes only - -const endPlayerPregnancy = (location) => { - let type; - if(V.player.vaginaExist){ - type = "vagina" - }else{ - type = "anus" - } - let pregnancy = V.sexStats[type].pregnancy; - let menstruation = V.sexStats.vagina.menstruation; - - if(!pregnancy || !pregnancy.fetus.length) return false; - - giveBirthToChildren("pc", location); - - if(pregnancy.potentialFathers.filter(npc => npc[0] === pregnancy.type).length >= 5) Wikifier.wikifyEval('<<earnFeat "Bicycle Mother">>'); - - switch(pregnancy.type){ - case "human": - V.pregnancyStats.humanToysUnlocked = true; - menstruation.recoveryTime = random(2,3) * V.humanPregnancyMonths; - if(pregnancy.fetus.length === 3) Wikifier.wikifyEval('<<earnFeat "Life Comes in Threes">>'); - break; - case "wolf": - V.pregnancyStats.wolfToysUnlocked = true; - menstruation.recoveryTime = random(1,2) * V.wolfPregnancyWeeks; - break; - } - let birthEvents = clone(pregnancy.totalBirthEvents || 0) + 1; - - if((V.player.virginity.anal === true && !V.player.vaginaExist) || (V.player.virginity.vaginal === true && V.player.vaginaExist)) Wikifier.wikifyEval('<<earnFeat "Miracle of Life">>'); - if(!V.player.vaginaExist) Wikifier.wikifyEval('<<earnFeat "Life begins when you least expect">>'); - - V.sexStats[type].pregnancy = { - ...pregnancy, - totalBirthEvents: birthEvents, - fetus: [], - waterBreaking: false, - waterBreakingTimer: null, - type: null, - bellySize: 0, - timer: null, - timerEnd: null, - awareOf: null, - potentialFathers: [], - } - - V.sexStats.vagina.menstruation = { - ...menstruation, - currentState: "recovering", - recoveryTimeStart: menstruation.recoveryTime, - recoveryStage: 0, - periodEnabled: false, - awareOfPeriodDelay: false, - } - return true; -} -DefineMacro("endPlayerPregnancy", endPlayerPregnancy); -window.endPlayerPregnancyTest = (location) => {if(V.pregnancyTesting && location) return endPlayerPregnancy(location);};//V.pregnancyTesting Check should not be removed, debugging purposes only +window.namedNpcPregnancyTest = (mother, father, pregnancyType, fatherKnown, trackedNPCs, awareOf) => {if(V.pregnancyTesting) return namedNpcPregnancy(mother, father, pregnancyType, fatherKnown, trackedNPCs, awareOf);};//V.pregnancyTesting Check should not be removed, debugging purposes only const endNPCPregnancy = (npcName, location) => { if(!C.npc[npcName] || C.npc[npcName].vagina === "none" || C.npc[npcName].pregnancy.enabled === undefined){ @@ -329,6 +471,7 @@ const endNPCPregnancy = (npcName, location) => { } DefineMacro("endNPCPregnancy", endNPCPregnancy); window.endNPCPregnancyTest = (npcName, location) => {if(V.pregnancyTesting && npcName && location) return endNPCPregnancy(npcName, location);};//V.pregnancyTesting Check should not be removed, debugging purposes only +/*Named NPC pregnancy ends here*/ const giveBirthToChildren = (mother, location) => { let pregnancy; @@ -370,19 +513,121 @@ const giveBirthToChildren = (mother, location) => { return true; } -function pregnancyBellyVisible() { - const size = playerBellySize(); - if (size <= 7) return false; - if (size <= 11 && V.worn.upper.name !== "naked" && !V.worn.upper.type.includes("bellyShow")) return false; - if (size <= 17 && V.worn.upper.type.includes("bellyHide")) return false; +const recordSperm = ({genital = "vagina", target = null, spermOwner = null, spermType = null, daysTillRemovalOverride = null, rngModifier = 100, rngType, quantity}) => { + //ToDo: Pregnancy - remove the `V.pregnancyTesting` check + if(!V.pregnancyTesting) return null; + if(!target || !spermOwner || !spermType || !["anus","vagina"].includes(genital)) return null; - return true; + if(V.pregnancytype === "fetish"){ + return fetishPregnancy({genital, target, spermOwner, spermType, rngModifier, quantity}); + } + + let sperm; + if(target === "pc") { + sperm = V.sexStats[genital].sperm; + }else if(C.npc[target] && C.npc[target].pregnancy && C.npc[target].pregnancy.enabled){ + sperm = C.npc[target].pregnancy.sperm; + } + if(sperm){ + if(sperm[spermOwner] === undefined){ + sperm[spermOwner] = {type:spermType, count:[]}; + } + let daysTillRemoval = daysTillRemovalOverride || random(4,8); + rngModifier = !isNaN(rngModifier) ? rngModifier : 100; + + if(spermOwner === "pc"){ + let pills = V.sexStats.pills; + let lastPillsTaken = pills.lastTaken.pregnancy; + switch(lastPillsTaken){ + case "fertility booster": rngModifier += ((pills.pills[lastPillsTaken].doseTaken || 0) * 25); break; + case "contraceptive": rngModifier -= ((pills.pills[lastPillsTaken].doseTaken || 0) * 50); break; + } + }else if(C.npc[spermOwner] && C.npc[spermOwner].pregnancy){ + switch(C.npc[spermOwner].pregnancy.pills){ + case "fertility": rngModifier += 25; break; + case "contraceptive": rngModifier -= 50; break; + } + } + rngModifier = Math.clamp(rngModifier,0,200); + if(rngModifier === 0) return false; + + //The number in `1 + rngType`, the number should match the number of times `updatePlayerRecordedSperm` should not delete the `canWash` tag + switch(rngType){ + case "canWash": rngType = 1 + rngType; break; + default: break; + } + + let spermFound = sperm[spermOwner].count.find(s => s[0] === daysTillRemoval && s[2] === rngModifier && s[3] === rngType); + if(spermFound){ + spermFound[1] += quantity || 1; + return true; + }else{ + sperm[spermOwner].count.push([daysTillRemoval, quantity || 1]); + if(!isNaN(rngModifier)){ + sperm[spermOwner].count.last().push(rngModifier); + if(rngType) sperm[spermOwner].count.last().push(rngType); + } + return true; + } + } + return false; } -window.pregnancyBellyVisible = pregnancyBellyVisible; +DefineMacro("recordSperm",recordSperm); +DefineMacro("recordVaginalSperm", (target, spermOwner, spermType,daysTillRemovalOverride) => recordSperm({target:target, spermOwner:spermOwner, spermType:spermType, daysTillRemovalOverride:daysTillRemovalOverride})); +DefineMacro("recordAnusSperm", (target, spermOwner, spermType,daysTillRemovalOverride) => recordSperm({genital:"anus", target:target, spermOwner:spermOwner, spermType:spermType, daysTillRemovalOverride:daysTillRemovalOverride})); + +//Period is `1 divided how many timers per day the function is run` +const updateRecordedSperm = (genital, target, period = 1) => { + //ToDo: Pregnancy - remove the `V.pregnancyTesting` check + if(!V.pregnancyTesting) return null; + + let sperm; + if(genital !== "vagina" && target !== "pc") return null; + if(target === "pc") { + sperm = V.sexStats[genital].sperm; + }else if(C.npc[target] && C.npc[target].pregnancy && C.npc[target].enabled){ + sperm = C.npc[target].sperm; + } + if(sperm){ + Object.values(sperm).forEach(s => { + s.count.forEach(count => { + count[0] -= period; + if(count[3] && count[3].includes("canWash") && !isNaN(parseInt(count[3]))){ + let canWashCount = parseInt(count[3]); + canWashCount--; + if(canWashCount >= 0){ + count[3] = canWashCount + "canWash"; + }else{ + count[3] = 0; + } + } + }); + //Delete sperm that has passed it's lifespan + s.count = s.count.filter(count => count[0] > 0); + }) + } +} +DefineMacro("updateRecordedSperm",updateRecordedSperm); + +const washRecordedSperm = (genital, target) => { + let sperm; + if(genital !== "vagina" && target !== "pc") return null; + if(target === "pc") { + sperm = V.sexStats[genital].sperm; + }else if(C.npc[target] && C.npc[target].pregnancy && C.npc[target].enabled){ + sperm = C.npc[target].sperm; + } + if(sperm){ + Object.values(sperm).forEach(s => { + //Delete sperm thats been washed in time + s.count = s.count.filter(count => !count[3].includes("canWash")); + }); + } +} +DefineMacro("washRecordedSperm",washRecordedSperm); -window.playerIsPregnant = () => (V.sexStats.vagina.pregnancy.type !== null && V.sexStats.vagina.pregnancy.type !== "parasites") || (V.sexStats.anus.pregnancy.type !== null && V.sexStats.anus.pregnancy.type !== "parasites"); -function playerCanBreedWith(npc) { +window.playerCanBreedWith = (npc) => { /* This function can accept either a named NPC's name, or an NPC object from either NPCList or NPCName. * Examples: playerCanBreedWith("Kylar"), or playerCanBreedWith($NPCList[0]) or playerCanBreedWith($NPCName[$NPCNameList.indexOf("Kylar")]) * Returns true or false. If you give it garbage, like a totally wrong name, it'll return false, so be careful about silent failures like that. @@ -392,15 +637,13 @@ function playerCanBreedWith(npc) { return (V.player.vaginaExist && npc.penis !== "none") || (V.player.penisExist && npc.vagina !== "none"); } -window.playerCanBreedWith = playerCanBreedWith; -function pregnancyCompatible(NPC) { +window.pregnancyCompatible = (NPC) => { if (playerPregnancyPossibleWith(NPC) === false || NPCPregnancyPossibleWithPlayer(NPC) === false) return false; return true; } -window.pregnancyCompatible = pregnancyCompatible; -function playerPregnancyPossibleWith(NPC) { +window.playerPregnancyPossibleWith = (NPC) => { /* Like the above function, this will accept either a named NPC's name, or an NPC object from either NPCList or NPCName. * This one checks if the player could become pregnant, rather than the NPC. * Returns true or false, as well as sets T.pregFalseReason, so writers can make events around the specific reason why a player and NPC might not be compatible for pregnancy at any given time. @@ -454,9 +697,8 @@ function playerPregnancyPossibleWith(NPC) { } return true; } -window.playerPregnancyPossibleWith = playerPregnancyPossibleWith; -function NPCPregnancyPossibleWithPlayer(NPC) { +window.NPCPregnancyPossibleWithPlayer = (NPC) => { /* Like the above function, this will accept either a named NPC's name, or an NPC object from either NPCList or NPCName. * This one checks if the NPC could become pregnant, rather than the player. * Returns true or false, as well as sets T.pregFalseReason, so writers can make events around the specific reason why a player and NPC might not be compatible for pregnancy at any given time. @@ -502,4 +744,4 @@ function NPCPregnancyPossibleWithPlayer(NPC) { } return true; } -window.NPCPregnancyPossibleWithPlayer = NPCPregnancyPossibleWithPlayer; + diff --git a/game/03-JavaScript/04-Pregnancy/storyFunctions.js b/game/03-JavaScript/04-Pregnancy/storyFunctions.js index 48a7de7ec9..20389ba431 100644 --- a/game/03-JavaScript/04-Pregnancy/storyFunctions.js +++ b/game/03-JavaScript/04-Pregnancy/storyFunctions.js @@ -46,24 +46,47 @@ window.playerBellySize = (pregnancyOnly = false) => { return Math.clamp(bellySize,0,20); } -const playerEndWaterProgress = () => { - let pregnancy; - if(V.player.vaginaExist){ - pregnancy = V.sexStats.vagina.pregnancy; - }else{ - pregnancy = V.sexStats.anus.pregnancy; - } - if(!pregnancy.fetus.length || pregnancy.timer < pregnancy.timerEnd) return false; - if(!isNaN(pregnancy.waterBreakingTimer) && pregnancy.waterBreakingTimer > 0){ - pregnancy.waterBreakingTimer--; - if(pregnancy.waterBreakingTimer <= 0){ - pregnancy.waterBreaking = true; - return true; +window.pregnancyBellyVisible = () => { + const size = playerBellySize(); + if (size <= 7) return false; + if (size <= 11 && V.worn.upper.name !== "naked" && !V.worn.upper.type.includes("bellyShow")) return false; + if (size <= 17 && V.worn.upper.type.includes("bellyHide")) return false; + + return true; +} + +window.npcBellySize = (npc) => { + let bellySize = 0; + if(C.npc(npc) && C.npc(npc).pregnancy && C.npc(npc).pregnancy.enabled){ + let pregnancy = C.npc(npc).pregnancy; + let pregnancyProgress = 0; + if(pregnancy.timerEnd) pregnancyProgress = Math.clamp(vpregnancy.timer / vpregnancy.timerEnd, 0, 1); + let maxSize = 0; + switch(pregnancy.type){ + case "human": + maxSize += 18 + Math.clamp(vpregnancy.fetus.length,1,3); + break; + case "wolf": + maxSize += 16 + Math.clamp(vpregnancy.fetus.length / 2,1,4); + break; + default: + maxSize += 20; + break; } - return false; + bellySize += pregnancyProgress * maxSize; } + + return bellySize; +} + +window.npcPregnancyBellyVisible = (npc) => { + const size = npcBellySize(npc); + if (size <= 7) return false; + + return true; } -DefineMacro("playerEndWaterProgress", playerEndWaterProgress); + +window.playerIsPregnant = () => (V.sexStats.vagina.pregnancy.type !== null && V.sexStats.vagina.pregnancy.type !== "parasites") || (V.sexStats.anus.pregnancy.type !== null && V.sexStats.anus.pregnancy.type !== "parasites"); window.isPlayerNonparasitePregnancyEnding = () => { return V.sexStats.vagina.pregnancy.waterBreaking || V.sexStats.anus.pregnancy.waterBreaking || false; @@ -77,15 +100,6 @@ window.nonparasitePregnancyType = () => { } } -//Used only when the player is about to give birth to their children and the player can name them -const playerEndWaterBreaking = () => { - V.sexStats.vagina.pregnancy.waterBreaking = null; - V.sexStats.vagina.pregnancy.waterBreakingTimer = null; - V.sexStats.anus.pregnancy.waterBreaking = null; - V.sexStats.anus.pregnancy.waterBreakingTimer = null; -} -DefineMacro("playerEndWaterBreaking", playerEndWaterBreaking); - window.wakingPregnancyEvent = (rng) => { let pregnancy; if(V.player.vaginaExist){ @@ -101,7 +115,7 @@ window.wakingPregnancyEvent = (rng) => { if(playerBellySize(true) >= 8 && !pregnancy.awareOf){ return "bellySize"; - } else if(!menstruation.awareOfPeriodDelay && V.awareness >= 100 && V.sciencetrait >= 3 && !pregnancy.awareOf && pregnancyStage !== false && between(pregnancy.timer - (menstruation.currentDaysMax - menstruation.currentDay), 4, 8)){ + } else if(V.cycledisable === "f" && !menstruation.awareOfPeriodDelay && V.awareness >= 100 && V.sciencetrait >= 3 && !pregnancy.awareOf && pregnancyStage !== false && between(pregnancy.timer - (menstruation.currentDaysMax - menstruation.currentDay), 4, 8)){ return "missedPeriod"; } else if(between(pregnancyStage, 0.9, 1)){ wakingEffects = "nearBirthEvent"; @@ -172,7 +186,7 @@ window.dailyPregnancyEvent = (rng) => { dailyEffects = "morningSicknessPills"; } else if(["contraceptive","fertility booster"].includes(lastPregPill) && pills.pills[lastPregPill].doseTaken >= 1 && rng >= 95){ dailyEffects = "mildIssues"; - } else if(menstruation.currentState === "normal" && (menstruation.currentDay < 3 || menstruation.currentDay >= menstruation.currentDaysMax - 1 && rng >= 80)){ + } else if(V.cycledisable === "f" && menstruation.currentState === "normal" && (menstruation.currentDay < 3 || menstruation.currentDay >= menstruation.currentDaysMax - 1 && rng >= 80)){ dailyEffects = "periodIssues"; } @@ -198,3 +212,12 @@ window.dailyPregnancyEvent = (rng) => { } return false; } + +window.pregnancyNameCorrection = (name) => { + switch(name){ + case "Black Wolf": case "Great Hawk": case "Ivory Wraith": + name = "the " + name; + break; + } + return name; +} diff --git a/game/04-Variables/variables-versionUpdate.twee b/game/04-Variables/variables-versionUpdate.twee index 1bdb5eacf6..84a4a579f9 100644 --- a/game/04-Variables/variables-versionUpdate.twee +++ b/game/04-Variables/variables-versionUpdate.twee @@ -3495,6 +3495,11 @@ <<if $sexStats.vagina.pregnancy.fetus is undefined or $sexStats.anus.pregnancy.fetus is undefined or $sexStats.anus.pregnancy.type is undefined>> <<physicalAdjustmentsInit>> <</if>> + + <<if !$pregnancytype>> + <<set $cycledisable to "f">> + <<set $pregnancytype to "realistic">> + <</if>> <</widget>> <<widget "backComp">> diff --git a/game/base-combat/ejaculation-eden.twee b/game/base-combat/ejaculation-eden.twee index 6ae8f3b04d..f2e64a8588 100644 --- a/game/base-combat/ejaculation-eden.twee +++ b/game/base-combat/ejaculation-eden.twee @@ -329,13 +329,16 @@ <<case 1 2 3>> <<He>> holds you still by the hips while <<his>> $NPCList[_nn].penisdesc rubs against your <<pussy>>. The sensation proves too much, and <<he>> ejaculates onto your labia. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> rubs <<his>> $NPCList[_nn].penisdesc against your <<pussy>> and climaxes, sending white streams of semen onto your labia. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> $NPCList[_nn].penisdesc as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> moans as <<he>> cums, ejaculating over your $worn.genitals.name. "I'm gonna find whoever has the key," <<he>> gasps. "Then fuck you until you can't walk." @@ -345,13 +348,16 @@ <<He>> cums before <<he>> can penetrate your <<pussy>>, ejaculating on your labia. "I deserve a medal for restraint," <<he>> says. "Your unguarded pussy was right there, teasing me." <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> tries to push <<his>> $NPCList[_nn].penisdesc into you as <<he>> approaches <<his>> peak, but <<his>> body's spasms betray <<him>>. <<He>> ejaculates, sending white streams of semen onto your labia. "Fuck," <<he>> says. "So close." <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 7>> <<He>> grasps your hips for purchase and tries to bury <<his>> $NPCList[_nn].penisdesc in your <<pussy>>, but cums too soon. Thick ropes of semen cover your labia, and drip over your <<bottom>>. "You're almost too hot." <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch random(1, 7)>> @@ -369,6 +375,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription "human">> <</switch>> <<elseif $NPCList[_nn].penis is "cheeks" and $worn.genitals.type.includes("chastity")>> <<He>> gasps as <<he>> cums, ejaculating over your $worn.genitals.name. "That fucking device," <<he>> gasps. "Your ass deserves such a pounding." @@ -643,13 +650,16 @@ <<case 1 2 3>> <<He>> thrusts against your clit and labia, <<his>> $NPCList[_nn].penisdesc twitching and erupting with semen. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> rubs <<his>> $NPCList[_nn].penisdesc against your <<pussy>> with savage thrusts, each less coordinated than the last as <<he>> approaches <<his>> peak. <<He>> shudders into orgasm. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 7>> <<He>> moans as <<he>> rubs <<his>> $NPCList[_nn].penisdesc against your <<pussy>>. Thick ropes of semen cover your crotch and <<bottom>>. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> moans as <<he>> cums, ejaculating over your $worn.genitals.name. "If only I could find the key," <<he>> gasps. "I'd give that pussy a proper fucking." @@ -660,14 +670,17 @@ <<gstress>><<gtrauma>><<gpain>><<violence 6>><<bruise bottom>><<hitstat>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> grasps your hips for purchase and tries to violate your <<pussy>>, but it's too late. <<His>> semen covers your labia. "Sometimes," <<he>> gasps. "It's like you're too hot." <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 7>> <<He>> moans as <<he>> approaches <<his>> peak, <<his>> $NPCList[_nn].penisdesc twitching against your <<pussy>>. Thick ropes of semen shoot over your labia and <<bottom>>. "You should get cleaned up," <<he>> pants, shutting <<his>> eyes for a moment. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch random(1, 7)>> @@ -685,6 +698,7 @@ <<He>> convulses as <<he>> thrusts into your <<pussy>>, <<his>> pelvis rubbing against your <<clit>> and $NPCList[_nn].penisdesc sending thick waves of cum into your body. Semen drips down your thighs. "I need to train you to hold cum better." <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription "human">> <</switch>> <<elseif $NPCList[_nn].penis is "cheeks">> <<switch random(1, 7)>> diff --git a/game/base-combat/ejaculation-gloryhole.twee b/game/base-combat/ejaculation-gloryhole.twee index fc1e856633..05478ce8cc 100644 --- a/game/base-combat/ejaculation-gloryhole.twee +++ b/game/base-combat/ejaculation-gloryhole.twee @@ -320,15 +320,18 @@ <<He>> groans as <<he>> ejaculates onto your <<pussy>>. You feel semen coating your outer lips and pooling around your knees. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[0].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> strokes <<his>> cock and ejaculates onto your <<pussy>> without a word, sending streams of semen running down your cunt; you can feel <<him>> flicking <<his>> cock dry on your ass. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[0].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> cock as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[0].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[0].penis is "vaginaimminent">> <<switch random(1, 7)>> @@ -336,14 +339,17 @@ <<He>> cums before <<he>> can penetrate your <<pussy>>, ejaculating on the outside. Semen coats your outer lips and tummy. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[0].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> ejaculates onto your <<pussy>> before <<he>> can penetrate you, sending warm streams of semen running down your cunt; <<he>> groans in disappointment. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[0].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> cock as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[0].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> <<elseif $NPCList[0].penis is "vagina">><<creampie "self" "vagina">> @@ -364,6 +370,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[0].fullDescription "human">> <</switch>> <<elseif $NPCList[0].penis is "cheeks">> <<switch random(1, 7)>> diff --git a/game/base-combat/ejaculation-kylar.twee b/game/base-combat/ejaculation-kylar.twee index 7f202003e8..6f3f2a0329 100644 --- a/game/base-combat/ejaculation-kylar.twee +++ b/game/base-combat/ejaculation-kylar.twee @@ -344,15 +344,18 @@ <<He>> holds you still by the hips with one hand and with the other on <<his>> cock, ejaculates onto your <<pussy>>. Semen coats your outer lips and pools around your legs. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> strokes <<his>> cock and ejaculates onto your <<pussy>> without a word, sending white streams of semen running down your cunt. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> cock as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> gasps as <<he>> cums onto your $worn.genitals.name. "I-I can't take this," <<he>> says. "I need to fill you. Th-there must be a skeleton key for chastity stuff." @@ -363,15 +366,18 @@ <<He>> cums before <<he>> can penetrate your <<pussy>>, ejaculating on the outside. Semen coats your outer lips and tummy; <<he>> seems upset with <<himself>>. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> ejaculates onto your <<pussy>> before <<he>> can penetrate you, sending white streams of semen running down your <<pussy>>; <<he>> seems disappointed. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> cock as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch random(1, 7)>> @@ -391,6 +397,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription "human">> <</switch>> <<elseif $NPCList[_nn].penis is "cheeks" and $worn.genitals.type.includes("chastity")>> <<He>> gasps as <<he>> cums onto your $worn.genitals.name. "I-I can't take this," <<he>> says. "I need to fill you. Th-there must be a skeleton key for chastity stuff." @@ -760,15 +767,18 @@ <<He>> grabs your hips, pulling you back and ejaculating onto your <<pussy>>. Semen coats your outer lips and pools around your legs. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> strokes <<his>> cock and ejaculates onto your <<pussy>> without a word, sending white streams of semen running down your cunt. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> cock as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. <<He>> seems impressed with the mess <<hes>> made. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> gasps as <<he>> cums onto your $worn.genitals.name. "I-I can't take this," <<he>> says. "I need to fill you. Th-there must be a skeleton key for chastity stuff." @@ -779,15 +789,18 @@ <<He>> cums before <<he>> can penetrate your <<pussy>>, ejaculating on the outside. Semen coats your outer lips and tummy. <<He>> turns beet red in anger, small fists shaking, but does nothing. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> ejaculates onto your <<pussy>> before <<he>> can penetrate you, sending white streams of semen running down your cunt; <<he>> pulls <<his>> own hair in frustration. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> cock as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. <<He>> seems upset at first, but then smiles as <<he>> looks down on your <<lewdness>> covered in <<his>> cum. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch random(1, 7)>> @@ -807,6 +820,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription "human">> <</switch>> <<elseif $NPCList[_nn].penis is "cheeks" and $worn.genitals.type.includes("chastity")>> <<He>> gasps as <<he>> cums onto your $worn.genitals.name. "I-I can't take this," <<he>> says. "I need to fill you. Th-there must be a skeleton key for chastity stuff." diff --git a/game/base-combat/ejaculation-leighton.twee b/game/base-combat/ejaculation-leighton.twee index 1f83e958d8..370d219a8d 100644 --- a/game/base-combat/ejaculation-leighton.twee +++ b/game/base-combat/ejaculation-leighton.twee @@ -319,15 +319,18 @@ <<He>> holds you still by the hips with one hand and with the other on <<his>> cock, ejaculates onto your <<pussy>>. Semen coats your outer lips and pools around your legs. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> strokes <<his>> cock and ejaculates onto your <<pussy>> without a word, sending white streams of semen running down your cunt. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> cock as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> tenses as <<he>> cums, ejaculating over your $worn.genitals.name. "Whoever put you in that had the right idea," <<he>> gasps. "If only I had a key." @@ -338,15 +341,18 @@ <<He>> cums before <<he>> can penetrate your <<pussy>>, ejaculating on the outside. Semen coats your outer lips and tummy; <<he>> seems disappointed. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> ejaculates onto your <<pussy>> before <<he>> can penetrate you, sending white streams of semen running down your <<pussy>>; <<he>> seems disappointed. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> cock as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. "Quite a mess; you really should hit the showers." <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch random(1, 7)>> @@ -366,6 +372,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription "human">> <</switch>> <<elseif $NPCList[_nn].penis is "cheeks" and $worn.genitals.type.includes("chastity")>> <<He>> tenses as <<he>> cums, ejaculating over your $worn.genitals.name. "Whoever put you in that had the right idea," <<he>> gasps. "If only I had a key." @@ -668,15 +675,18 @@ <<He>> shoves <<his>> thumb into your ass, pulling you back and ejaculating onto your <<pussy>>. Semen coats your outer lips and pools around your legs. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> strokes <<his>> cock and ejaculates onto your <<pussy>> without a word, sending white streams of semen running down your cunt; flicking <<his>> cock dry on your body. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> cock as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass; <<he>> dries <<his>> cock on your thighs. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> tenses as <<he>> cums, ejaculating over your $worn.genitals.name. "Whoever put you in that had the right idea," <<he>> gasps. "If only I had a key." @@ -688,15 +698,18 @@ <<gstress>><<gtrauma>><<gpain>><<violence 6>><<bruise bottom>><<hitstat>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> ejaculates onto your <<pussy>> before <<he>> can penetrate you, sending white streams of semen running down your cunt; <<he>> groans in disappointment. <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> cock as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. "I hope you're learning that you're mine any time I want you." <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch random(1, 7)>> @@ -717,6 +730,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription "human">> <</switch>> <<elseif $NPCList[_nn].penis is "cheeks" and $worn.genitals.type.includes("chastity")>> <<He>> tenses as <<he>> cums, ejaculating over your $worn.genitals.name. "Whoever put you in that had the right idea," <<he>> gasps. "If only I had a key." diff --git a/game/base-combat/ejaculation-pillory.twee b/game/base-combat/ejaculation-pillory.twee index 4f1b2245b6..7bd80d53dd 100644 --- a/game/base-combat/ejaculation-pillory.twee +++ b/game/base-combat/ejaculation-pillory.twee @@ -192,15 +192,18 @@ <<He>> shoves <<his>> thumb into your ass and groans as <<he>> ejaculates onto your <<pussy>>. Semen coats your outer lips and pools around your legs. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> strokes <<his>> $NPCList[_nn].penisdesc and ejaculates onto your <<pussy>> without a word, sending white streams of semen running down your cunt; flicking <<his>> cock dry on your <<bottom>>. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> $NPCList[_nn].penisdesc as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass; <<he>> dries <<his>> cock on your thighs. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> gasps as <<he>> cums against your $worn.genitals.name. "They didn't have to lock you up down there too," <<he>> says. "I could have had so much fun." @@ -212,15 +215,18 @@ <<gstress>><<gtrauma>><<gpain>><<violence 6>><<bruise bottom>><<hitstat>> <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> ejaculates onto your <<pussy>> before <<he>> can penetrate you, sending white streams of semen running down your cunt; <<he>> groans in disappointment. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> $NPCList[_nn].penisdesc as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. "You must be so embarrassed to be seen in public with cum dripping down your legs." <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch $NPCList[_nn].penissize>> @@ -230,8 +236,10 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription "human">> <<case 1>> <<He>> moans as a dribble of cum leaks from <<his>> $NPCList[_nn].penisdesc and onto the outside of your <<genitals>>. + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <br><br> <<default>> <<switch random(1, 7)>> @@ -252,6 +260,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription "human">> <</switch>> <</switch>> <<elseif $NPCList[_nn].penis is "cheeks" and $worn.genitals.type.includes("chastity")>> diff --git a/game/base-combat/ejaculation-robin.twee b/game/base-combat/ejaculation-robin.twee index e55d4a0492..f03bc2b2a2 100644 --- a/game/base-combat/ejaculation-robin.twee +++ b/game/base-combat/ejaculation-robin.twee @@ -259,6 +259,7 @@ <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> gasps as <<he>> cums onto your $worn.genitals.name. "Isn't that uncomfortable?" <<he>> asks. "Do they make softer ones?" @@ -274,6 +275,7 @@ <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch random(1, 7)>> diff --git a/game/base-combat/ejaculation-sydney.twee b/game/base-combat/ejaculation-sydney.twee index fcb0f03d67..564858dbaa 100644 --- a/game/base-combat/ejaculation-sydney.twee +++ b/game/base-combat/ejaculation-sydney.twee @@ -541,6 +541,7 @@ <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<else>> <<switch _sydneyStatus>> <<case "pure" "pureLust">> @@ -557,6 +558,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <</if>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> gasps as <<he>> cums onto your $worn.genitals.name. @@ -574,6 +576,7 @@ <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<else>> <<switch _sydneyStatus>> <<case "pure" "pureLust">> @@ -588,12 +591,14 @@ <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <</switch>> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <</if>> <<elseif $NPCList[_nn].penis is "vagina">> <<set $daily.sydney.cum to true>> <<if random(1)>> <<He>> arches <<his>> back and moans out loud as you fuck <<him>> to climax. <<He>> pats your belly. "Was it good for you, too?" <<npcincr Sydney purity -5>><<llspurity>> <br><br> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human"}`>> <<else>> <<switch _sydneyStatus>> <<case "pure" "pureLust">> @@ -627,6 +632,7 @@ <br><br> <<vaginalejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <</switch>> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human"}`>> <</if>> <<elseif $NPCList[_nn].penis is "cheeks" and $worn.genitals.type.includes("chastity")>> <<He>> gasps as <<he>> cums onto your $worn.genitals.name. @@ -1053,6 +1059,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> moans as <<he>> cums onto your $worn.genitals.name. <<He>> looks angry. <<if _sydneyChastity>> @@ -1084,6 +1091,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch random(1, 7)>> <<case 1 2 3>> @@ -1101,6 +1109,7 @@ <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> <</switch>> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human"}`>> <<elseif $NPCList[_nn].penis is "cheeks" and $worn.genitals.type.includes("chastity")>> <<He>> moans as <<he>> cums onto your $worn.genitals.name. <<He>> looks angry. <<if _sydneyChastity>> diff --git a/game/base-combat/ejaculation-wall.twee b/game/base-combat/ejaculation-wall.twee index 71e27929e1..f33c3589b7 100644 --- a/game/base-combat/ejaculation-wall.twee +++ b/game/base-combat/ejaculation-wall.twee @@ -218,15 +218,18 @@ <<He>> shoves <<his>> thumb into your ass and groans as <<he>> ejaculates onto your <<pussy>>. You feel semen coating your outer lips and pooling around your knees. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> strokes <<his>> $NPCList[_nn].penisdesc and ejaculates onto your <<pussy>> without a word, sending streams of semen running down your cunt; you can feel <<him>> flicking <<his>> cock dry on your <<bottom>>. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> $NPCList[_nn].penisdesc as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass; <<he>> wipes <<his>> cock on your thighs. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 5, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> gasps as <<he>> cums onto your $worn.genitals.name. "Shame someone locked you up so tight," <<he>> says, giving your <<bottom>> a little smack. @@ -238,15 +241,18 @@ <<gstress>><<gtrauma>><<gpain>><<violence 6>><<bruise bottom>><<hitstat>> <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 4 5 6>> <<He>> ejaculates onto your <<pussy>> before <<he>> can penetrate you, sending warm streams of semen running down your cunt; <<he>> groans in disappointment. <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <<case 7>> <<He>> moans and strokes <<his>> $NPCList[_nn].penisdesc as <<he>> cums, sending thick ropes of semen onto your <<pussy>> and ass. "Such a filthy little bitch." <br><br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <</switch>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch $NPCList[_nn].penissize>> @@ -256,8 +262,10 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription "human">> <<case 1>> <<He>> moans as a dribble of cum leaks from <<his>> $NPCList[_nn].penisdesc and onto the outside of your <<genitals>>. + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: "human", rngModifier: 15, rngType: "canWash"}`>> <br><br> <<default>> <<switch random(1, 7)>> @@ -277,6 +285,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription "human">> <</switch>> <</switch>> <<elseif $NPCList[_nn].penis is "cheeks">> diff --git a/game/base-combat/ejaculation.twee b/game/base-combat/ejaculation.twee index 08470e2bf2..14463daf3b 100644 --- a/game/base-combat/ejaculation.twee +++ b/game/base-combat/ejaculation.twee @@ -92,7 +92,7 @@ <!-- NAMED NPCs: Named NPCs without custom modules use simple text to stay in character --> <<unset _condomResult>> - <<if $NPCList[_nn].condom>> + <<if $NPCList[_nn].condom && $NPCList[_nn].condom.worn>> <<if $NPCList[_nn].condom.state is "damaged">> <<set _condomResult to "leaked">> <<else>> @@ -166,6 +166,7 @@ <<He>> ejaculates onto your <<pussy>>. <</if>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 5, rngType: "canWash"}`>> <</if>> <<if $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> @@ -178,6 +179,7 @@ <<He>> ejaculates onto your <<pussy>>. <</if>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 15, rngType: "canWash"}`>> <</if>> <<if $NPCList[_nn].penis is "vagina">> @@ -1154,6 +1156,7 @@ <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 5, rngType: "canWash"}`>> <<elseif ($NPCList[_nn].penis is "vaginaimminent" or $NPCList[_nn].penis is "vaginaimminentdouble") and $worn.genitals.type.includes("chastity")>> <<He>> ejaculates onto your $worn.genitals.name, sending white streams of semen running down your thighs. <<set _postOrgasmSpeech to `"Wish I could have fucked you properly."`>> @@ -1172,6 +1175,7 @@ <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 15, rngType: "canWash"}`>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch $NPCList[_nn].penissize>> <<case 4>> @@ -1182,6 +1186,7 @@ <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> <<case 1>> <<He>> moans as a dribble of cum leaks from <<his>> $NPCList[_nn].penisdesc into your <<pussy>>. You expected more. + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 50}`>> <<default>> <<switch random(1, 7)>> <<case 1 2 3>> @@ -1197,6 +1202,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription `($enemytype is "man" ? "human" : $NPCList[_nn].type)`>> <</switch>> <</switch>> @@ -1212,6 +1218,7 @@ <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 5, rngType: "canWash"}`>> <<elseif $NPCList[_nn].penis is "vaginaimminentdouble">> <<switch random(1, 7)>> <<case 1 2 3>> @@ -1226,6 +1233,7 @@ <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 15, rngType: "canWash"}`>> <<elseif $NPCList[_nn].penis is "vaginadouble">> /* consensual */ <<switch $NPCList[_nn].penissize>> @@ -1238,6 +1246,7 @@ <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> <<case 1>> <<He>> moans as a dribble of cum leaks from <<his>> $NPCList[_nn].penisdesc into your <<pussy>>. You expected more. + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 50}`>> <<default>> <<switch random(1, 7)>> <<case 1 2 3>> @@ -1253,6 +1262,7 @@ <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<vaginalejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription `($enemytype is "man" ? "human" : $NPCList[_nn].type)`>> <</switch>> <</switch>> @@ -1309,6 +1319,7 @@ <<recordAnusSperm "pc" $NPCList[_nn].fullDescription `($enemytype is "man" ? "human" : $NPCList[_nn].type)`>> <<case 1>> <<He>> moans as a pathetic dribble of cum leaks from <<his>> $NPCList[_nn].penisdesc and over your <<bottom>>. You manage to hold in your laughter. + <<recordSperm `{genital: "anus", target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 50}`>> <<default>> <<switch random(1, 7)>> <<case 1 2 3>> @@ -1659,6 +1670,7 @@ <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 5, rngType: "canWash"}`>> <<elseif $NPCList[_nn].penis is "vaginaimminent" and $worn.genitals.type.includes("chastity")>> <<He>> ejaculates onto your $worn.genitals.name, sending white streams of semen running down your thighs. <<set _postOrgasmSpeech to `"Wish you weren't wearing that thing."`>> @@ -1677,6 +1689,7 @@ <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 15, rngType: "canWash"}`>> <<elseif $NPCList[_nn].penis is "vagina">> <<switch $NPCList[_nn].penissize>> <<case 4>> @@ -1689,7 +1702,7 @@ <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> <<case 1>> <<He>> moans as a dribble of cum leaks from <<his>> $NPCList[_nn].penisdesc and over your <<pussy>>. - + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 50, rngType: "canWash"}`>> <<default>> <<switch random(1, 7)>> <<case 1 2 3>> @@ -1710,6 +1723,7 @@ <<vaginalejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vagina" "semen">> <<vaginalentranceejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> + <<recordVaginalSperm "pc" $NPCList[_nn].fullDescription `($enemytype is "man" ? "human" : $NPCList[_nn].type)`>> <</switch>> <</switch>> <<elseif $NPCList[_nn].penis is "vaginaentrancedouble">> @@ -1723,6 +1737,7 @@ <<bottomejacstat>><<set $hygiene += 500>><<bodyliquid "bottom" "semen">> <</switch>> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 5, rngType: "canWash"}`>> <br> <<elseif $NPCList[_nn].penis is "vaginaimminentdouble" and $worn.genitals.type.includes("chastity")>> <<set _otherNPCIndex to (_nn is $vaginatarget ? $vaginatarget : $vaginadoubletarget)>> @@ -1762,6 +1777,7 @@ <</switch>> <br> <<vaginalentranceejacstat>><<ejacstat>><<set $hygiene += 500>><<bodyliquid "vaginaoutside" "semen">> + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 15, rngType: "canWash"}`>> <<elseif $NPCList[_nn].penis is "vaginadouble">> /* Noncon */ <<set _otherNPCIndex to (_nn is $vaginatarget ? $vaginadoubletarget : $vaginatarget)>> @@ -1775,7 +1791,7 @@ <<thighejacstat>><<set $hygiene += 500>><<bodyliquid "thigh" "semen">> <<case 1>> <<He>> moans as a dribble of cum leaks from <<his>> $NPCList[_nn].penisdesc, oozing over your <<pussy>> and <<personselect _otherNPCIndex>><<combatpersons>> <<npcPenis _otherNPCIndex>>. - + <<recordSperm `{target: "pc", spermOwner: $NPCList[_nn].fullDescription, spermType: $enemytype is "man" ? "human" : $NPCList[_nn].type, rngModifier: 50, rngType: "canWash"}`>> <<default>> <<switch random(1, 7)>> <<case 1 2 3>> diff --git a/game/base-system/named-npcs.twee b/game/base-system/named-npcs.twee index 64d266e6a4..11053d4c93 100644 --- a/game/base-system/named-npcs.twee +++ b/game/base-system/named-npcs.twee @@ -896,8 +896,8 @@ alternative way to write that: <!-- ToDo: Pregnancy, remove $pregnancyTesting to properly enable --> <<if $pregnancyTesting and $condomLvl gte 2>> <!-- 50 is the threshold for named NPCs bringing their own condoms, do not change --> - <<if ($NPCList[_n].pregnancyAvoidance gte 50 and !_condomIgnore)>> - <<set $NPCList[_n].condom to { + <<if ($NPCList[_npcno].pregnancyAvoidance gte 50 and !_condomIgnore)>> + <<set $NPCList[_npcno].condom to { willUse: true, state: (random(0,100) gt 98 ? "damaged" : "normal"), type: "plain", @@ -906,7 +906,7 @@ alternative way to write that: }>> <!-- Kylar brings their own sabotaged condoms --> <<elseif _nam is "Kylar">> - <<set $NPCList[_n].condom to { + <<set $NPCList[_npcno].condom to { willUse: false, state: "damaged", type: "plain", diff --git a/game/base-system/overlays/characteristics.twee b/game/base-system/overlays/characteristics.twee index da897f2a01..7e314553ff 100644 --- a/game/base-system/overlays/characteristics.twee +++ b/game/base-system/overlays/characteristics.twee @@ -120,18 +120,28 @@ You have a <<bottom>>. <</if>> <<if $_pregnancy.awareOf is true>> <<if $_pregnancy.timer / $_pregnancy.timerEnd lte 0.33>> - You know you're in the first trimester of your pregnancy. + <<set _trimester to "first">> <<elseif $_pregnancy.timer / $_pregnancy.timerEnd lte 0.66>> - You know you're in the second trimester of your pregnancy. + <<set _trimester to "second">> <<else>> - You know you're in the third trimester of your pregnancy. + <<set _trimester to "third">> + <</if>> + <<if $_pregnancy.awareOfDetails || $_pregnancy.potentialFathers.every((father, index, array) => father[0] === array[0][0])>> + <<set _number to $_pregnancy.awareOfDetails ? $_pregnancy.fetus.length : "an unknown number of">> + <<switch $_pregnancy.type>> + <<case "human">><<set _childType to "normal babies">> + <<case "wolf">><<set _childType to "wolf puppies">> + <</switch>> + You're pregnant with _number _childType in your _trimester trimester. + <<else>> + You know you're in the _trimester trimester of your pregnancy. <</if>> <<if $_pregnancy.potentialFathers.length is 1>> - You're sure the father is <<print $_pregnancy.potentialFathers[0][1]>>. + You know that the father is <<print pregnancyNameCorrection($_pregnancy.potentialFathers[0][1])>>. <<elseif $_pregnancy.potentialFathers.length is 2>> - You're pretty sure the father is either <<print $_pregnancy.potentialFathers[0][1]>> or <<print $_pregnancy.potentialFathers[1][1]>>. + You're sure that the father is either <<print pregnancyNameCorrection($_pregnancy.potentialFathers[0][1])>> or <<print pregnancyNameCorrection($_pregnancy.potentialFathers[1][1])>>. <<elseif $_pregnancy.potentialFathers.length is 3>> - You're pretty sure the father is either <<print $_pregnancy.potentialFathers[0][1]>>, <<print $_pregnancy.potentialFathers[1][1]>> or <<print $_pregnancy.potentialFathers[2][1]>>. + You're pretty sure that the father is either <<print pregnancyNameCorrection($_pregnancy.potentialFathers[0][1])>>, <<print pregnancyNameCorrection($_pregnancy.potentialFathers[1][1])>> or <<print pregnancyNameCorrection($_pregnancy.potentialFathers[2][1])>>. <<else>> You're unsure on who the father is. <</if>> diff --git a/game/base-system/physicalAdjustments.twee b/game/base-system/physicalAdjustments.twee index b14b1070ab..c3be26566a 100644 --- a/game/base-system/physicalAdjustments.twee +++ b/game/base-system/physicalAdjustments.twee @@ -258,8 +258,8 @@ <<set _breastMulti += (Math.clamp($sexStats.breasts.playedWith, 0, 500) / 250)>> - <<set _breastMulti += $sexStats.anus.pregnancy.fetus.length / 0.5>> - <<set _breastMulti += $sexStats.vagina.pregnancy.fetus.length / 0.5>> + <<set _breastMulti += Math.clamp($sexStats.anus.pregnancy.fetus.length / 10,0,0.5)>> + <<set _breastMulti += Math.clamp($sexStats.vagina.pregnancy.fetus.length / 10,0,0.5)>> <<if $purity gte 990>> <<set _breastMulti -= 1>> diff --git a/game/base-system/pregnancy/events.twee b/game/base-system/pregnancy/events.twee index c1218ce331..4e9e37f563 100644 --- a/game/base-system/pregnancy/events.twee +++ b/game/base-system/pregnancy/events.twee @@ -45,7 +45,7 @@ You shake your head. <<He>> holds open the door for you, and you leave the offic <br> <</if>> <<if $pregnancyStats.parasiteDoctorEvents gte 4 and ($sexStats.anus.pregnancy.motherStatus is 2 or ($sexStats.anus.pregnancy.motherStatus is 2 and !$warn.genitals.type.includes("hidden")))>> - <<link [[Inquire about anal futa removal (0:30)|Remove Futa Pregnancy]]>><<pass 30>><<set $futaCheck to true>><<set $firstOption to false>><</link>> + <<link [[Inquire about parasite hermaphrodite removal (0:30)|Remove Futa Pregnancy]]>><<pass 30>><<set $futaCheck to true>><<set $firstOption to false>><</link>> <br> <</if>> <<if $pregnancyStats.parasiteTypesSeen.length gte 4 and $pregnancyStats.parasiteBook is 1>> diff --git a/game/base-system/pregnancy/pregnancy.twee b/game/base-system/pregnancy/pregnancy.twee index 6f05925fa0..acb719ab84 100644 --- a/game/base-system/pregnancy/pregnancy.twee +++ b/game/base-system/pregnancy/pregnancy.twee @@ -117,7 +117,9 @@ <<set $_last_preg_pill to clone(_pills.lastTaken.pregnancy)>> <<switch _menstruation.currentState>> <<case "normal">> - <<if _menstruation.currentDay lt _menstruation.currentDaysMax>> + <<if $cycledisable is "t">> + <<playerPregnancyAttempt `random(1,200)` $_pregLocation>> + <<elseif _menstruation.currentDay lt _menstruation.currentDaysMax>> /*Continue the cycle again*/ <<if _menstruation.currentDay gte _menstruation.currentDaysMax / 2 and _menstruation.lastDaysMax isnot _menstruation.currentDaysMax>> <</if>> @@ -146,7 +148,7 @@ <</if>> /*Check for pregnancy at a reduced chance for a few days before*/ <<if _menstruation.currentDay gte _menstruation.stages[3] - 4>> - <<set $_multi = Math.clamp(Math.ceil(2 * (1 + _menstruation.stages[3] - _menstruation.currentDay)),2,10)>> + <<set $_multi = Math.clamp(Math.ceil(6 * (1 + _menstruation.stages[3] - _menstruation.currentDay)),6,30)>> <<playerPregnancyAttempt $_multi $_pregLocation>> <</if>> <<elseif _menstruation.currentDay lt _menstruation.stages[3]>> @@ -155,12 +157,12 @@ <<set _menstruation.lastDaysMax to _menstruation.currentDaysMax>> /*Check for pregnancy*/ - <<playerPregnancyAttempt 1 $_pregLocation>> + <<playerPregnancyAttempt 3 $_pregLocation>> <<else>> /*Luteal phase*/ /*Check for pregnancy at a reduced chance for a few days after*/ <<if _menstruation.currentDay lte _menstruation.stages[3] + 4>> - <<set $_multi = Math.clamp(Math.ceil(2 * (1 + _menstruation.currentDay - _menstruation.stages[3])),2,10)>> + <<set $_multi = Math.clamp(Math.ceil(6 * (1 + _menstruation.currentDay - _menstruation.stages[3])),6,30)>> <<playerPregnancyAttempt $_multi $_pregLocation`>> <</if>> <<if $_last_preg_pill and _pills.pills[$_last_preg_pill].doseTaken gte 2>> @@ -179,54 +181,6 @@ <<restartMenstruationCycle>> <<set _menstruation.periodEnabled to true>> <</if>> - <<case "pregnant">> - <<switch _pregnancy.type>> - <<case "human">><<set _multiplier to (1/(1/9*$humanPregnancyMonths))>> - <<case "wolf">><<set _multiplier to (1/(1/12*$wolfPregnancyWeeks))>> - <<default>><<set _multiplier to 1>> - <</switch>> - <<set $_pregnancy.timer += parseFloat((0.5 * _multiplier).toFixed(3))>> - - /*Keeping fatigue low should help morning sickness*/ - <<if between($_pregnancy.timer / $_pregnancy.timerEnd, 0.15, 0.25)>> - /*Early Morning sickness*/ - /*Light Nausea/dizzyness at any time of day, but mostly when waking up*/ - <<if random(0,100) gte 30>> - <<set $pregnancyStats.morningSicknessWaking to 1>> - <</if>> - <<if random(0,100) gte 30>> - <<set $pregnancyStats.morningSicknessGeneral to 1>> - <</if>> - <<elseif between($_pregnancy.timer / $_pregnancy.timerEnd, 0.24, 0.45)>> - /*Morning sickness*/ - /*Nausea/dizzyness at any time of day, but mostly when waking up*/ - /*First pregnancy should be worse*/ - <<set $pregnancyStats.morningSicknessWaking to [1,2,2][random(0,2)]>> - <<if $_pregnancy.totalBirthEvents is 0 and $pregnancyStats.morningSicknessWaking lt 2>> - <<set $pregnancyStats.morningSicknessWaking to 2>> - <</if>> - <<if random(0,100) gte 20>> - <<set $pregnancyStats.morningSicknessGeneral to [1,2,2][random(0,2)]>> - <</if>> - <</if>> - <<if $_pregnancy.timer gte $_pregnancy.timerEnd>> - <<set _menstruation.currentState to "pregnantEnd">> - <<if $player.breastsize lte 4 and $player.breastsize lt $breastsizemax>> - <<set $player.breastsize += 1>><<set $breastgrowthtimer to 700>> - <<if $player.breastsize lte 4 and $player.breastsize lt $breastsizemax>> - <<set $player.breastsize += 1>> - <</if>> - <<set $breastgrowthmessage to $player.breastsize>><<set $effectsmessage to 1>> - <<set $player.breastsize to Math.clamp($player.breastsize, 0, 12)>> - <</if>> - <<if $lactating isnot 1 and $player.breastsize gt 0>> - <<set $lactating to 1>> - <<set $lactation_pressure to 100>> - <<milkvolume 50>> - <<set $effectsmessage to 1>> - <<set $lactationmessage to 1>> - <</if>> - <</if>> <<case "recovering">> <<set _menstruation.recoveryTime -= 0.5>> <<if $_last_preg_pill is "fertility booster">> @@ -254,88 +208,12 @@ <</if>> <</switch>> <</if>> -<<updateRecordedSperm "vagina">> -<<updateRecordedSperm "anus">> +<<updateRecordedSperm "vagina" "pc" 0.5>> +<<updateRecordedSperm "anus" "pc" 0.5>> <</widget>> :: Pregnancy2 [widget] -<<widget "updateRecordedSperm">> -<<set _sperm to $sexStats[_args[0]].sperm>> -<<for $_label, $_value range _sperm>> - <<for _i to $_value.count.length - 1; _i gte 0; _i-->> - <<set $_value.count[_i][0] -= 0.5>> - <<if $_value.count[_i][0] lte 0>> - <<run _sperm[$_label].count.deleteAt(_i)>> - <</if>> - <</for>> - <<if $_value.count.length is 0>> - <<run delete _sperm[$_label]>> - <</if>> -<</for>> -<</widget>> - -/*args[0] - potential mother, args[1] - npc fullDescription or "pc", _args[2] - type of pregnancy, _args[3] - _daysTillRemoval override for specific events*/ -<<widget "recordVaginalSperm">> -/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/ -<<if _args[0] and _args[1] and _args[2] and $pregnancyTesting>> - <<if _args[0] is "pc">> - <<set $_sperm to $sexStats.vagina.sperm>> - <<elseif $NPCNameList.includes(_args[0]) and $NPCName[$NPCNameList.indexOf(_args[0])].pregnancy.enabled>> - <<set $_sperm to $NPCName[$NPCNameList.indexOf(_args[0])].pregnancy.sperm>> - <</if>> - <<if $_sperm>> - <<if $_sperm[_args[1]] is undefined>> - <<set $_sperm[_args[1]] to {"type":_args[2], count:[]}>> - <</if>> - <<if _args[3]>> - <<set _daysTillRemoval to _args[3]>> - <<else>> - <<set _daysTillRemoval to random(4,8)>> - <</if>> - <<for $_i to 0; $_i lt $_sperm[_args[1]].count.length;$_i++>> - <<if $_sperm[_args[1]].count[$_i][0] is _daysTillRemoval>> - <<set $_sperm[_args[1]].count[$_i][1] += 1>> - <<set $_found to true>> - <</if>> - <</for>> - <<if $_found isnot true>> - <<set $_sperm[_args[1]].count.push([_daysTillRemoval, 1])>> - <</if>> - <</if>> -<</if>> -<</widget>> - -<<widget "recordAnusSperm">> -/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/ -<<if _args[0] and _args[1] and _args[2] and $pregnancyTesting>> - <<if _args[0] is "pc">> - <<set $_sperm to $sexStats.anus.sperm>> - <<elseif $NPCNameList.includes(_args[0]) and $NPCName[$NPCNameList.indexOf(_args[0])].pregnancy.enabled>> - /*<<set $_sperm to $NPCName[$NPCNameList.indexOf(_args[0])].pregnancy.sperm>> Not tracking right now*/ - <</if>> - <<if $_sperm>> - <<if $_sperm[_args[1]] is undefined>> - <<set $_sperm[_args[1]] to {"type":_args[2], count:[]}>> - <</if>> - <<if _args[3]>> - <<set _daysTillRemoval to _args[3]>> - <<else>> - <<set _daysTillRemoval to random(4,8)>> - <</if>> - <<for $_i to 0; $_i lt $_sperm[_args[1]].count.length;$_i++>> - <<if $_sperm[_args[1]].count[$_i][0] is _daysTillRemoval>> - <<set $_sperm[_args[1]].count[$_i][1] += 1>> - <<set $_found to true>> - <</if>> - <</for>> - <<if $_found isnot true>> - <<set $_sperm[_args[1]].count.push([_daysTillRemoval, 1])>> - <</if>> - <</if>> -<</if>> -<</widget>> - <<widget "bodyPregCalc">> <<switch $bodysize>> <<case 0>><<set _bodySize to ["tiny","tiny","tiny","small","small","normal","large"]>> @@ -764,7 +642,7 @@ <<set $_pregnancy.enabled to true>> <<set $_pregnancy.cycleDaysTotal to random(24,32)>> <<set $_pregnancy.cycleDay to random(1,$_pregnancy.cycleDaysTotal)>> - <<set $_pregnancy.cycleDangerousDay to 5>> + <<set $_pregnancy.cycleDangerousDay to 10>> <<set $_pregnancy.sperm to {}>> <<set $_pregnancy.potentialFathers to []>> <<switch $_name>> diff --git a/game/base-system/settings.twee b/game/base-system/settings.twee index 698986a8bb..8fecdcfa6c 100644 --- a/game/base-system/settings.twee +++ b/game/base-system/settings.twee @@ -1096,7 +1096,7 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh <div class="solidBorderContainer"><div class="numberslider-inline"> <div class="numberslider-inline basevaginalpregnancychance-container"> <span class="gold">Base Vaginal Pregnancy Chance</span> - <div class="small-description">Chance of conceiving when only being inseminated once at the right time, <span id="maxRequired"><<print 100 - $baseVaginalPregnancyChance>></span> times to guarantee. Some events may leave you with more than one helping of cum. Certain days of your menstruation cycle and other effects may modify the base chance.</div> + <div class="small-description">Chance of conceiving when only being inseminated once at the right time. Some events may leave you with more than one helping of cum. Cum on the outside of your vagina, rarely may get you pregnant unless you wash it off before several hours pass. Certain days of your menstruation cycle and other effects may modify the base chance.</div> <<numberslider "$baseVaginalPregnancyChance" $baseVaginalPregnancyChance 0 96 4>> </div> <<run $(() => { $('.basevaginalpregnancychance-container input').on('input change', e => { diff --git a/game/base-system/time.twee b/game/base-system/time.twee index efcfd645c0..3b148f9cbf 100644 --- a/game/base-system/time.twee +++ b/game/base-system/time.twee @@ -1315,6 +1315,8 @@ /*ToDo: Pregnancy, remove check to properly enable*/ <<if $pregnancyTesting>> <<menstruationCycle>> + <<pregnancyProgress>> + <<pregnancyProgress "anus">> <</if>> <<if $robinPilloryFail>> @@ -1362,6 +1364,8 @@ /*ToDo: Pregnancy, remove check to properly enable*/ <<if $pregnancyTesting>> <<menstruationCycle>> + <<pregnancyProgress>> + <<pregnancyProgress "anus">> <</if>> <<unset $birdSleep>> <<unset $glideScared>> @@ -1448,6 +1452,7 @@ <<set $pregnancyDailyEvent to true>> <</if>> <<playerEndWaterProgress>> + <<playerEndWaterProgress "anus">> <<temperature_hour>> diff --git a/game/base-system/widgets.twee b/game/base-system/widgets.twee index 4ca76bf1e6..e03df071bd 100644 --- a/game/base-system/widgets.twee +++ b/game/base-system/widgets.twee @@ -3062,6 +3062,8 @@ or _args[0] is "force">> <<if $player.bodyliquid[_bodypart]["semen"] gte 1>><<set $waterwash += 1>><<set $allure += 500>><<bodyliquid _bodypart "semen" -1>><</if>> <<if $player.bodyliquid[_bodypart]["nectar"] gte 1>><<set $waterwash += 1>><<set $allure += 500>><<bodyliquid _bodypart "nectar" -1>><</if>> <</for>> + <<washRecordedSperm "vagina" "pc">> + <<washRecordedSperm "anus" "pc">> <</if>> <<if $waterwash gte 10>> @@ -3080,6 +3082,8 @@ or _args[0] is "force">> <</widget>> <<widget "wash">> + <<washRecordedSperm "vagina" "pc">> + <<washRecordedSperm "anus" "pc">> <<bodyliquid "clear">> <<if $parasite.right_thigh.name is "maggot">> <<removeparasite right_thigh>> diff --git a/game/overworld-town/loc-home/pills.twee b/game/overworld-town/loc-home/pills.twee index 0fed998c60..10400a62f9 100644 --- a/game/overworld-town/loc-home/pills.twee +++ b/game/overworld-town/loc-home/pills.twee @@ -163,10 +163,10 @@ As you get up, you check the time to find that<<if $timePassed gt 240>> many <<e <<addinlineevent "simple fertility overdose" 5>> Despite the warning, you only feel a little warm for a few minutes but feel fine afterwards. <<garousal>><<arousal 100>> <br><br> - <<link [[Next (0:02)|PillCollection]]>><<pass 2>><</link>> + <<link [[Next (0:03)|PillCollection]]>><<pass 3>><</link>> <</addinlineevent>> <<addinlineevent "simple fertility overdose 2" 4>> - You start to feel an odd warmth around your vagina for a few minutes but feel fine afterwards. It was oddly comforting. <<garousal>><<arousal 200>> + You start to feel an strange warmth around your <<genitals 2>> for a few minutes but feel fine afterwards. It was oddly soothing. <<garousal>><<arousal 200>> <<if _pills.pills[_fertilityPillName].doseTaken lt 3>> <<set _pills.pills[_fertilityPillName].doseTaken to 3>> <</if>> @@ -174,7 +174,7 @@ As you get up, you check the time to find that<<if $timePassed gt 240>> many <<e <<link [[Next (0:05)|PillCollection]]>><<pass 5>><</link>> <</addinlineevent>> <<addinlineevent "advanced fertility overdose" 2>> - You start feeling an odd warmth around your vagina, however, it doesn't seem to stop until at one point you feel like it's burning you. The heat seems to start expanding to other areas of your body but then begins to subside. <<garousal>><<arousal 1000>><<gpain>><<pain 10>> + You start feeling an strange warmth around your <<genitals 2>>, however, it doesn't seem to stop until at one point you feel like it's burning you. The heat seems to start expanding to other areas of your body but then begins to subside. <<garousal>><<arousal 1000>><<gpain>><<pain 10>> <<if _pills.pills[_fertilityPillName].doseTaken lt 4>> <<set _pills.pills[_fertilityPillName].doseTaken to 4>> <</if>> @@ -192,7 +192,7 @@ As you get up, you check the time to find that<<if $timePassed gt 240>> many <<e <<link [[Next (0:15)|PillCollection]]>><<pass 15>><</link>> <</addinlineevent>> <<addinlineevent "advanced fertility overdose" 2>> - You feel an odd warmth around your vagina. It intensifies, until it almost burns. The head expands, covering your body until it reaches your head, forcing you into the fetal position. You remain that way until you recover from the overdose. <<garousal>><<arousal 1000>><<ggpain>><<pain 100>> + You feel a strange warmth around your <<genitals 2>>, intensifying until it practically burns. It quickly spreads through the rest of your body, and you collapse from the pain. You remain that way until the heat finally dies down. <<garousal>><<arousal 1000>><<ggpain>><<pain 100>> <<if _pills.pills[_fertilityPillName].doseTaken lt 4>> <<set _pills.pills[_fertilityPillName].doseTaken to 4>> <</if>> @@ -210,7 +210,7 @@ As you get up, you check the time to find that<<if $timePassed gt 240>> many <<e <<link [[Next (1:00)|PillCollection]]>><<pass 60>><</link>> <</addinlineevent>> <<addinlineevent "advanced fertility overdose 2" 2>> - You feel an odd warmth around your vagina. It intensifies, until it almost burns. The head expands, covering your body until it reaches your head, forcing you into the fetal position. The pain forces you to pass out. <<garousal>><<arousal 1000>><<ggpain>><<pain 100>> + You feel a strange warmth around your <<genitals 2>>, intensifying until it practically burns. It quickly spreads through the rest of your body, and you collapse from the pain. The sheer intensity overwhelms your senses, and your vision fades to black... <<garousal>><<arousal 1000>><<ggpain>><<pain 100>> <<if _pills.pills[_fertilityPillName].doseTaken lt 4>> <<set _pills.pills[_fertilityPillName].doseTaken to 4>> <</if>> @@ -229,14 +229,25 @@ As you get up, you check the time to find that<<if $timePassed gt 240>> many <<e Disregarding the warning label, you take a second dose of the contraceptive pills. <br><br> <<addinlineevent "no contraceptive overdose" 10>> - Despite the warning, nothing wrong seems to happen. + Despite it, nothing wrong seems to happen. <br><br> <<link [[Next (0:02)|PillCollection]]>><<pass 2>><</link>> <</addinlineevent>> <<addinlineevent "simple contraceptive overdose" 5>> - Despite the warning, you only feel a little cold for a few minutes but feel fine afterwards. <<garousal>><<arousal -100>> + Despite it, you only feel a little chilly for a few minutes but feel fine afterwards. <<larousal>><<arousal -100>> <br><br> - <<link [[Next (0:02)|PillCollection]]>><<pass 2>><</link>> + <<link [[Next (0:03)|PillCollection]]>><<pass 3>><</link>> + <</addinlineevent>> + <<addinlineevent "contraceptive overdose" 3>> + After a few minutes, an odd, chilly sensation hits you. It spreads through your <<genitals 2>>, leaving a slight numbness in its wake that quickly dissipates on its own.<<llarousal>><<arousal -200>> + <br><br> + <<if $genitalsensitivity gt 2>> + <<set $genitalsensitivity -= 0.25>> + <</if>> + <<if $bottomsensitivity gt 2>> + <<set $bottomsensitivity -= 0.25>> + <</if>> + <<link [[Next (0:30)|PillCollection]]>><<pass 30>><</link>> <</addinlineevent>> <</if>> @@ -245,7 +256,7 @@ As you get up, you check the time to find that<<if $timePassed gt 240>> many <<e :: PillCollectionFertilityPassOut <<set $outside to 0>><<effects>> -You end up waking in with your vagina feeling rather warm. At least compared to before you passed out, it contains an oddly comfort, making you wonder what effect the two pills had on you was. +You end up waking in with your <<genitals 2>> feeling rather warm. At least compared to before you passed out, it contains an oddly comfort, making you wonder what effect the two pills had on you was. <br><br> <<link [[Next (0:02)|PillCollection]]>><<pass 2>><</link>> \ No newline at end of file diff --git a/modules/css/base.css b/modules/css/base.css index 7bfd411c63..b70285c78d 100644 --- a/modules/css/base.css +++ b/modules/css/base.css @@ -1211,6 +1211,7 @@ body.has-images #story-caption #storyCaptionDiv { /* 232 px: img size, 1.32 em: stats line height, 4px: stats borders */ position: absolute; /*top: calc(232px + 1.32em);*/ + top: 192px; height: calc(100% - 20px - 1.32em); left: 10px; width: 268px; @@ -1218,7 +1219,7 @@ body.has-images #story-caption #storyCaptionDiv { body.has-images #storyCaptionContent { position: absolute; - top: calc(125px + 1.32em); + top: calc(5px + 1.32em); width: 268px; height: calc(100% - 170px - 1.32em); padding-right: 2px; @@ -1228,7 +1229,7 @@ body.has-images #storyCaptionContent { } #storyCaptionDiv.statsExtended > #storyCaptionContent { - top: calc(125px + 2.64em); + top: calc(5px + 2.64em); height: calc(100% - 170px - 2.64em); } @@ -1465,7 +1466,7 @@ span.suit { border-bottom: var(--150) 2px solid; padding-top: 1px; position: absolute; - top: 120px; + /*top: 120px;*/ left: -10px; background-color: var(--850); z-index: 1000; -- GitLab