diff --git a/src/js/utilsAssaySlave.js b/src/js/utilsAssaySlave.js index d9a4ff083bacaefda9c947af7ed9600396bcd902..e3b47a59060b7cd3978f8b5fd64b88915c4334ed 100644 --- a/src/js/utilsAssaySlave.js +++ b/src/js/utilsAssaySlave.js @@ -66,198 +66,6 @@ globalThis.getSlaveTrustClass = function(slave) { } }; -/** - * @param {App.Entity.SlaveState} slave - * @param {number} [induce] - * @returns {string} - */ -globalThis.induceLactation = function(slave, induce = 0) { - const {His} = getPronouns(slave); - let r = ""; - let lactationStartChance = jsRandom(10, 100); - slave.induceLactation += induce; - if (slave.boobs < 300) { - lactationStartChance *= 1.5; - } else if (slave.boobs < 400 || slave.boobs >= 5000) { - lactationStartChance *= 1.2; - } - if (slave.pubertyXX === 0) { - lactationStartChance *= 1.5; - } - if (slave.preg > (slave.pregData.normalBirth / 1.33)) { - lactationStartChance *= .5; - } - if (slave.health.condition < -20) { - lactationStartChance *= 2; - } - if (slave.weight <= -30) { - lactationStartChance *= 1.5; - } - if (slave.boobsImplant > 0) { - lactationStartChance *= (1 + (slave.boobsImplant / slave.boobs)); - } - if (slave.lactationAdaptation > 0) { - lactationStartChance = (lactationStartChance / (slave.lactationAdaptation / 10)); - } - if (slave.geneticQuirks.galactorrhea === 2) { - lactationStartChance *= .5; - } - lactationStartChance = Math.floor(lactationStartChance); - if (slave.induceLactation >= lactationStartChance) { - r += `${His} breasts have been stimulated often enough to <span class="lime">induce lactation.</span>`; - slave.induceLactation = 0; - slave.lactationDuration = 2; - slave.lactation = 1; - } - return r; -}; - -/** - * @param {string} targetSkill - Skill to be checked. - * @param {Object} slave - Slave to be checked. - * @param {number} [skillIncrease=1] - * @returns {string} - */ -globalThis.slaveSkillIncrease = function(targetSkill, slave, skillIncrease = 1) { - let r = "", skillDec; - const {He, his, him} = getPronouns(slave); - const isleadershipRole = function() { - if (['headGirl', 'recruiter', 'bodyguard', 'madam', 'DJ', 'nurse', 'teacher', 'attendant', 'matron', 'stewardess', 'milkmaid', 'farmer', 'wardeness'].includes(targetSkill)) { - return true; - } - return false; - }; - - if (slave.skill[targetSkill] <= 10) { - switch(targetSkill) { - case 'oral': - case 'vaginal': - case 'anal': - skillDec = `knowledge about ${targetSkill} sex,`; break; - case 'whoring': - skillDec = `knowledge about how to whore,`; break; - case 'entertainment': - skillDec = `knowledge about how to be entertaining,`; break; - } - if (isleadershipRole()) { - skillDec = `${capFirstChar(targetSkill)} skills.`; - } - - if (slave.skill[targetSkill] + skillIncrease > 10) { - r = `<span class="green">${He} now has basic ${skillDec}</span>`; - switch(targetSkill) { - case 'oral': - r += ` and at least suck a dick without constant gagging.`; break; - case 'vaginal': - r += ` and can avoid some of the common pitfalls and turnoffs.`; break; - case 'anal': - r += ` and can accept penetration of ${his} anus without danger.`; break; - case 'whoring': - r += ` and can avoid some potentially dangerous situations.`; break; - case 'entertainment': - r += ` and can usually avoid serious faux pas.`; break; - } - } - } else if (slave.skill[targetSkill] <= 30) { - switch(targetSkill) { - case 'oral': - case 'vaginal': - case 'anal': - skillDec = `${targetSkill} skills,`; break; - case 'whoring': - skillDec = `skill as a whore,`; break; - case 'entertainment': - skillDec = `skill as an entertainer,`; break; - } - if (isleadershipRole()) { - skillDec = `skill as a ${capFirstChar(targetSkill)}.`; - } - - if (slave.skill.oral + skillIncrease > 30) { - r = `<span class="green">${He} now has some ${skillDec}</span>`; - switch(targetSkill) { - case 'oral': - r += ` and can reliably bring dicks and pussies to climax with ${his} mouth.`; break; - case 'vaginal': - r += ` and can do more than just lie there and take it.`; break; - case 'anal': - r += ` and needs less preparation before taking rough penetration.`; break; - case 'whoring': - r += ` and knows how to sell ${his} body at a good price.`; break; - case 'entertainment': - r += ` and can flirt, dance, and strip acceptably.`; break; - } - } - } else if (slave.skill[targetSkill] <= 60) { - switch(targetSkill) { - case 'oral': - case 'vaginal': - case 'anal': - skillDec = `${targetSkill} sex expert,`; break; - case 'whoring': - skillDec = `expert whore,`; break; - case 'entertainment': - skillDec = `expert entertainer,`; break; - } - if (isleadershipRole()) { - skillDec = `expert ${capFirstChar(targetSkill)}.`; - } - - if (slave.skill[targetSkill] + skillIncrease > 60) { - r = `<span class="green">${He} is now an ${skillDec}</span>`; - switch(targetSkill) { - case 'oral': - r += ` and has a delightfully experienced tongue.`; break; - case 'vaginal': - r += ` and has the muscular control to massage anything that's inside ${him}.`; break; - case 'anal': - r += ` and knows how to use ${his} sphincter to please.`; break; - case 'whoring': - r += ` and can often make clients forget that $he's a prostitute they're paying for.`; break; - case 'entertainment': - r += ` and can flirt engagingly, dance alluringly, and strip arousingly.`; break; - } - } - } else if (slave.skill[targetSkill] < 100) { - switch(targetSkill) { - case 'oral': - case 'vaginal': - case 'anal': - skillDec = `has mastered ${targetSkill} sex,`; break; - case 'whoring': - skillDec = `is now a masterful whore,`; break; - case 'entertainment': - skillDec = `is now a masterful entertainer,`; break; - } - if (isleadershipRole()) { - skillDec = `is now a masterful ${capFirstChar(targetSkill)}.`; - } - - if (slave.skill[targetSkill] + skillIncrease >= 100) { - r = `<span class="green">${He} ${skillDec}</span>`; - switch(targetSkill) { - case 'oral': - r += ` and can learn nothing more about sucking dick or eating pussy.`; break; - case 'vaginal': - r += ` and can learn nothing more about tribbing or taking dick.`; break; - case 'anal': - r += ` and can learn nothing more about taking it up the ass.`; break; - case 'whoring': - r += ` and can learn nothing more about prostitution.`; break; - case 'entertainment': - r += ` and can learn nothing more about flirting, dancing, or stripping.`; break; - } - } - } - - if (isleadershipRole() && slave.skill[targetSkill] + skillIncrease >= 100) { - V.tutorGraduate.push(slave.ID); - V.slaveTutor[capFirstChar(targetSkill)].delete(slave.ID); - } - slave.skill[targetSkill] += skillIncrease; - return r; -}; - /** * Returns a "disobedience factor" between 0 (perfectly obedient) and 100 (completely defiant) * @param {App.Entity.SlaveState} slave diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js index 02f8e60df6fb86c4ca77de3a71bab6278a839d50..0059cb694f8bfa3a7c15851d8c2fc6c385a7fce6 100644 --- a/src/js/utilsSlave.js +++ b/src/js/utilsSlave.js @@ -3254,3 +3254,195 @@ globalThis.ageSlave = function(slave, forceDevelopment = false) { physicalDevelopment(slave); } }; + +/** + * @param {App.Entity.SlaveState} slave + * @param {number} [induce] + * @returns {string} + */ +globalThis.induceLactation = function(slave, induce = 0) { + const {His} = getPronouns(slave); + let r = ""; + let lactationStartChance = jsRandom(10, 100); + slave.induceLactation += induce; + if (slave.boobs < 300) { + lactationStartChance *= 1.5; + } else if (slave.boobs < 400 || slave.boobs >= 5000) { + lactationStartChance *= 1.2; + } + if (slave.pubertyXX === 0) { + lactationStartChance *= 1.5; + } + if (slave.preg > (slave.pregData.normalBirth / 1.33)) { + lactationStartChance *= .5; + } + if (slave.health.condition < -20) { + lactationStartChance *= 2; + } + if (slave.weight <= -30) { + lactationStartChance *= 1.5; + } + if (slave.boobsImplant > 0) { + lactationStartChance *= (1 + (slave.boobsImplant / slave.boobs)); + } + if (slave.lactationAdaptation > 0) { + lactationStartChance = (lactationStartChance / (slave.lactationAdaptation / 10)); + } + if (slave.geneticQuirks.galactorrhea === 2) { + lactationStartChance *= .5; + } + lactationStartChance = Math.floor(lactationStartChance); + if (slave.induceLactation >= lactationStartChance) { + r += `${His} breasts have been stimulated often enough to <span class="lime">induce lactation.</span>`; + slave.induceLactation = 0; + slave.lactationDuration = 2; + slave.lactation = 1; + } + return r; +}; + +/** + * @param {string} targetSkill - Skill to be checked. + * @param {Object} slave - Slave to be checked. + * @param {number} [skillIncrease=1] + * @returns {string} + */ +globalThis.slaveSkillIncrease = function(targetSkill, slave, skillIncrease = 1) { + let r = "", skillDec; + const {He, his, him} = getPronouns(slave); + const isleadershipRole = function() { + if (['headGirl', 'recruiter', 'bodyguard', 'madam', 'DJ', 'nurse', 'teacher', 'attendant', 'matron', 'stewardess', 'milkmaid', 'farmer', 'wardeness'].includes(targetSkill)) { + return true; + } + return false; + }; + + if (slave.skill[targetSkill] <= 10) { + switch(targetSkill) { + case 'oral': + case 'vaginal': + case 'anal': + skillDec = `knowledge about ${targetSkill} sex,`; break; + case 'whoring': + skillDec = `knowledge about how to whore,`; break; + case 'entertainment': + skillDec = `knowledge about how to be entertaining,`; break; + } + if (isleadershipRole()) { + skillDec = `${capFirstChar(targetSkill)} skills.`; + } + + if (slave.skill[targetSkill] + skillIncrease > 10) { + r = `<span class="green">${He} now has basic ${skillDec}</span>`; + switch(targetSkill) { + case 'oral': + r += ` and at least suck a dick without constant gagging.`; break; + case 'vaginal': + r += ` and can avoid some of the common pitfalls and turnoffs.`; break; + case 'anal': + r += ` and can accept penetration of ${his} anus without danger.`; break; + case 'whoring': + r += ` and can avoid some potentially dangerous situations.`; break; + case 'entertainment': + r += ` and can usually avoid serious faux pas.`; break; + } + } + } else if (slave.skill[targetSkill] <= 30) { + switch(targetSkill) { + case 'oral': + case 'vaginal': + case 'anal': + skillDec = `${targetSkill} skills,`; break; + case 'whoring': + skillDec = `skill as a whore,`; break; + case 'entertainment': + skillDec = `skill as an entertainer,`; break; + } + if (isleadershipRole()) { + skillDec = `skill as a ${capFirstChar(targetSkill)}.`; + } + + if (slave.skill.oral + skillIncrease > 30) { + r = `<span class="green">${He} now has some ${skillDec}</span>`; + switch(targetSkill) { + case 'oral': + r += ` and can reliably bring dicks and pussies to climax with ${his} mouth.`; break; + case 'vaginal': + r += ` and can do more than just lie there and take it.`; break; + case 'anal': + r += ` and needs less preparation before taking rough penetration.`; break; + case 'whoring': + r += ` and knows how to sell ${his} body at a good price.`; break; + case 'entertainment': + r += ` and can flirt, dance, and strip acceptably.`; break; + } + } + } else if (slave.skill[targetSkill] <= 60) { + switch(targetSkill) { + case 'oral': + case 'vaginal': + case 'anal': + skillDec = `${targetSkill} sex expert,`; break; + case 'whoring': + skillDec = `expert whore,`; break; + case 'entertainment': + skillDec = `expert entertainer,`; break; + } + if (isleadershipRole()) { + skillDec = `expert ${capFirstChar(targetSkill)}.`; + } + + if (slave.skill[targetSkill] + skillIncrease > 60) { + r = `<span class="green">${He} is now an ${skillDec}</span>`; + switch(targetSkill) { + case 'oral': + r += ` and has a delightfully experienced tongue.`; break; + case 'vaginal': + r += ` and has the muscular control to massage anything that's inside ${him}.`; break; + case 'anal': + r += ` and knows how to use ${his} sphincter to please.`; break; + case 'whoring': + r += ` and can often make clients forget that $he's a prostitute they're paying for.`; break; + case 'entertainment': + r += ` and can flirt engagingly, dance alluringly, and strip arousingly.`; break; + } + } + } else if (slave.skill[targetSkill] < 100) { + switch(targetSkill) { + case 'oral': + case 'vaginal': + case 'anal': + skillDec = `has mastered ${targetSkill} sex,`; break; + case 'whoring': + skillDec = `is now a masterful whore,`; break; + case 'entertainment': + skillDec = `is now a masterful entertainer,`; break; + } + if (isleadershipRole()) { + skillDec = `is now a masterful ${capFirstChar(targetSkill)}.`; + } + + if (slave.skill[targetSkill] + skillIncrease >= 100) { + r = `<span class="green">${He} ${skillDec}</span>`; + switch(targetSkill) { + case 'oral': + r += ` and can learn nothing more about sucking dick or eating pussy.`; break; + case 'vaginal': + r += ` and can learn nothing more about tribbing or taking dick.`; break; + case 'anal': + r += ` and can learn nothing more about taking it up the ass.`; break; + case 'whoring': + r += ` and can learn nothing more about prostitution.`; break; + case 'entertainment': + r += ` and can learn nothing more about flirting, dancing, or stripping.`; break; + } + } + } + + if (isleadershipRole() && slave.skill[targetSkill] + skillIncrease >= 100) { + V.tutorGraduate.push(slave.ID); + V.slaveTutor[capFirstChar(targetSkill)].delete(slave.ID); + } + slave.skill[targetSkill] += skillIncrease; + return r; +};