diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index b8bb22e895002ad45135dca2cd946e7cc01a1482..e7a200b5cbb5376ec3147de2b4cd7985e694d5a3 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -1048,6 +1048,23 @@ App.Data.resetOnNGPlus = { week: 1, + slaveTutor: { + HeadGirl: [], + Recruiter: [], + Bodyguard: [], + Madam: [], + DJ: [], + Nurse: [], + Teacher: [], + Attendant: [], + Matron: [], + Stewardess: [], + Milkmaid: [], + Farmer: [], + Wardeness: [] + }, + tutorGraduate: [], + weddingPlanned: 0, /** @type {string|Array<{ID:number, trainingRegimen:string}>} */ personalAttention: "sex", diff --git a/src/endWeek/saTakeClasses.js b/src/endWeek/saTakeClasses.js index 109cb7c35515c5e3842a08e0815d463d9d5c468a..2dc4501d554930d7082b4fa1409d3aa63761a502 100644 --- a/src/endWeek/saTakeClasses.js +++ b/src/endWeek/saTakeClasses.js @@ -37,6 +37,9 @@ App.SlaveAssignment.takeClasses = (function() { if (slave.accent > 1 && slave.voice !== 0) { speechLessons(slave); } + if (tutorForSlave(slave) != null) { + tutorLessons(slave); + } } graduation(slave); return r; @@ -464,6 +467,185 @@ App.SlaveAssignment.takeClasses = (function() { } } + /** + * @param {App.Entity.SlaveState} slave + * + */ + function tutorLessons(slave) { + let cost = 7500; + let skillIncrease = 0; + + if (V.schoolroomRemodelBimbo !== 1 || slave.assignment !== Job.SCHOOL) { + skillIncrease = (10 + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)); + } else { + skillIncrease = (10 + (Math.abs(Math.floor((slave.intelligence + slave.intelligenceImplant) / 32)))); + } + if (V.cash > cost) { + cashX(forceNeg(cost), "capEx"); + switch (tutorForSlave(slave)) { + case "Headgirl": + if (slave.skill.headGirl <= 10) { + r += ` ${He} is so unskilled that the tutor teaches ${him} the basics. ${He} learns how to make slaves obey ${him} and how to treat minor injuries.`; + } else if (slave.skill.headGirl <= 30) { + r += ` ${He} has some experience teaching others. The tutor has ${him} practice teaching slaves how to please their master, and has ${him} attend lectures on slave psychology.`; + } else if (slave.skill.headGirl <= 60) { + r += ` The tutor arranges for ${him} to work at different places throughout the week, from treating emergencies or diagnosing patients in the hospital to breaking resistant slaves for a slave school. ${He} is truly becoming a jack-of-all trades.`; + } else if (slave.skill.headGirl <= 100) { + r += ` Now that ${he} has mastered individual skills, ${he} is taught to assist you in running the arcology as a whole. ${He} learns how the security systems work, and how to make every slave perform at their best.`; + } + r += ` ${SkillIncrease.Headgirl(slave, skillIncrease)}`; + break; + case "Recruiter": + if (slave.skill.recruiter <= 10) { + r += ` The tutor starts teaching ${him} the basics. ${He} is given lessons on conversing, pronounciation, style and fashion.`; + } else if (slave.skill.recruiter <= 30) { + r += ` Having been taught the basics by ${his} tutor, ${he} is no longer awkard in conversation. But ${he} has a long way to go, the tutor teaches ${him} how to carry ${himself} and how to interpret others' non-verbal cues.`; + } else if (slave.skill.recruiter <= 60) { + r += ` The tutor has ${him} practice convincing others. ${He} watches online lectures on slave pschyology, and applies it in practice by convincing others to make unfavorable deals.`; + } else if (slave.skill.recruiter <= 100) { + r += ` Every move ${he} makes is practiced and calculated, yet looks entirely natural. He has ${him} continue attending lectures on pschyology, and sends ${him} out to convince free citizens to let themselves get voluntarily enslaved.`; + } + r += ` ${SkillIncrease.Recruiter(slave, skillIncrease)}`; + break; + case "Bodyguard": + if (slave.skill.bodyguard <= 10) { + r += ` ${He} undergoes a personalized boot camp in form of physical exercises, to make sure ${he} has the basic skills required for further security training.`; + } else if (slave.skill.bodyguard <= 30) { + r += ` The tutor trains ${him} in using and maintaining firearms, and forces ${him} through repetitive dry fire training in order to instill discipline.`; + } else if (slave.skill.bodyguard <= 60) { + r += ` During the week ${he} attends skirmish-scale wargames, and joins routine security patrols around the arcology.`; + } else if (slave.skill.bodyguard <= 100) { + r += `${He} receives versatile training on tactics and different weapons, culminating at the end of the week with a live fire exercise.`; + } + break; + case "Madam": + if (slave.skill.madam <= 10) { + r += ` The tutor teaches ${him} the basics of whoring. To make sure the customer pays before he's serviced, how to take care of her hygiene and how to take care of her health.`; + } else if (slave.skill.madam <= 30) { + r += ` Having been taught the basics, the lessons shift to learning how to best please a customer. ${He} is taught to converse and how to respond to a customer's desires.`; + } else if (slave.skill.madam <= 60) { + r += ` Now that ${he} is a masterful whore, the tutor teaches ${him} how to discipline her subordinate whores. ${He} attends online lectures on marketing.`; + } else if (slave.skill.madam <= 100) { + r += ` ${He} is becoming a master at extracting maximum value from the assets ${he} commands, and is learning how to run the brothel effectively.`; + } + r += ` ${SkillIncrease.Madam(slave, skillIncrease)}`; + break; + case "DJ": + if (slave.skill.DJ <= 10) { + r += ` The tutor trains ${him} to perform as a DJ. The Club is crucial for your reputation, and the DJ is in charge of the club, so classes are quite demanding. ${He} is absolutely unskilled so he is teaching ${him} the very basics. ${He} is undergoing military-like drills in dancing and composure.`; + } else if (slave.skill.DJ <= 30) { + r += ` The tutor trains ${him} to perform as a DJ. ${He} is still quite inexperienced, although ${he} is at least not awkard in conversation anymore. ${His} classes are heavily focused on slut etiquette, dancing and composure, but ${his} moves are still stiff and unsure.`; + } else if (slave.skill.DJ <= 60) { + r += ` ${He} is already a skilled entartainer, yet ${his} DJ training continues. ${His} training is now more focused on putting ${him} in charge of the whole club facility, which serves to increase public opinion of ${his} owner. ${He} is taught how to make guests feel welcome, and how to manage ${his} employees. `; + } else if (slave.skill.DJ <= 100) { + r += `Every movement and gesture of ${him} must engage the crowd. ${He} is so well-trained that ${his} sultry and inviting composure seems entirely natural. ${He} is also taught how to look after subordinate club sluts, to make sure they perform at their best and give the guests an unforgettable experience.`; + } + r += ` ${SkillIncrease.DJ(slave, skillIncrease)}`; + break; + case "Nurse": + if (slave.skill.nurse <= 10) { + r += ` ${He} is taught bedside manner, first aid and elementary physiology as basis for further medical tutoring.`; + } else if (slave.skill.nurse <= 30) { + r += ` During the week ${he} follows tutored instructions on doing common medical tests, preliminary diagnosis and the safe administering of drugs.`; + } else if (slave.skill.nurse <= 60) { + r += ` ${He} is busy watching lectures on physiology, pathology, biochemistry and other medical subjects under the supervision of a tutor.`; + } else if (slave.skill.nurse <= 100) { + r += `In addition to many, lengthy lectures on medicine, ${he} studies emergency care and basic surgery in supervised simulations.`; + } + r += ` ${SkillIncrease.Nurse(slave, skillIncrease)}`; + break; + case "Teacher": + if (slave.skill.teacher <= 10) { + r += ` ${He} is so inept that the tutor has to teach ${him} the very basics before ${he} can progress any further. ${He} is given grammar and arithmetic lessons.`; + } else if (slave.skill.teacher <= 30) { + r += ` Now that ${he} has some understanding of the basics, the tutor has ${him} attend more advanced lectures on grammar, mathematics and pronounciation.`; + } else if (slave.skill.teacher <= 60) { + r += ` Having mastered basic skills, ${he} is now being taught how to teach others. The tutor sends ${him} to work at a local slave school.`; + } else if (slave.skill.teacher <= 100) { + r += ` ${He} now knows how to teach others, and is now taught how to teach students who do not speak the language, are disabled, be it physically or mentally or simply unwilling to learn.`; + } + r += ` ${SkillIncrease.Teacher(slave, skillIncrease)}`; + break; + case "Attendant": + if (slave.skill.attendant <= 10) { + r += ` This week, a tutor has ${him} wait on poolside clients while offering back-rubs, an exercise instilling, more than anything, calm patience.`; + } else if (slave.skill.attendant <= 30) { + r += ` ${He} practices massaging techniques with a tutor until ${his} hands are sore and then suffers through hours of listening to people's problems on an online helpline.`; + } else if (slave.skill.attendant <= 60) { + r += ` A tutor teaches ${him} relaxing physical therapies. Additionally ${he} attends a course on applied psychology concentrated on mental well-being and stress management.`; + } else if (slave.skill.attendant <= 100) { + r += `${He} spends the week watching lectures of psychiatry and physiotherapy, before attending a practical exam arranged by ${his} tutor.`; + } + r += ` ${SkillIncrease.Attendant(slave, skillIncrease)}`; + break; + case "Matron": + if (slave.skill.matron <= 10) { + r += ` The tutor teaches ${him} how to care for ${his} body during pregnancy. To eat well, rest, and avoid strenous activity.`; + } else if (slave.skill.matron <= 30) { + r += ` ${He} learns how to best prepare ${his} body for a baby's birth. And how to take care of the baby after it has been born.`; + } else if (slave.skill.matron <= 60) { + r += ` The tutor has ${her} serve as a midwife at a local hospital. ${He} also attends lectures on child development and child psychology.`; + } else if (slave.skill.matron <= 100) { + r += ` ${He} continues attending lectures, but at the same time the tutor teaches ${him} how to take care of others while they are pregnant. ${He}'s quickly learning how to best rear children.`; + } + r += ` ${SkillIncrease.Matron(slave, skillIncrease)}`; + break; + case "Stewardess": + if (slave.skill.stewardess <= 10) { + r += ` ${He} has no skill as a servant, so the tutor teaches ${him} the basics. What to clean, how to clean and using which products.`; + } else if (slave.skill.stewardess <= 30) { + r += ` Having been taught the basics, ${his} studies continue by following cleaning crews to various parts of your arcologies to get practical experience as well as become familiar with the cleaning routines of all sectors.`; + } else if (slave.skill.stewardess <= 60) { + r += ` The tutor has ${him} attend lectures on slave breaking and management, to prepare ${him} for running a facility. ${He} keeps working with the cleaning crews, but now takes command during outings.`; + } else if (slave.skill.stewardess <= 100) { + r += ` ${He} is familiar with every nook and cranny of your arcology. ${He} no longer accompanies your cleaning crews, instead ${he} organizes their deployments. ${He}is becoming an adept manager.`; + } + r += ` ${SkillIncrease.Stewardess(slave, skillIncrease)}`; + break; + case "Milkmaid": + if (slave.skill.milkmaid <= 10) { + r += ` The tutor teaches ${her} the basics. ${He} is taught what to eat to maximize ${his} fluid production, as well as how to milk udders.`; + } else if (slave.skill.milkmaid <= 30) { + r += ` Having been taught the basics, the tutor has ${him} work at a farm milking cows. ${He} also attends online lectures on nutrition and health.`; + } else if (slave.skill.milkmaid <= 60) { + r += ` Having been taught how to milk and how to take care of ${his} body to produce as much fluids as possible, ${his} training shifts to teach ${him} leadership skills.`; + } else if (slave.skill.milkmaid <= 100) { + r += ` ${He} is becoming an adept leader, who knows how to squeeze every last drop of milk and cum out ${his} cows. The tutor believes ${he} will soon be able to run ${his} facility on ${his} own.`; + } + r += ` ${SkillIncrease.Milkmaid(slave, skillIncrease)}`; + break; + case "Farmer": + if (slave.skill.farmer <= 10) { + r += ` The tutor has ${him} working on a farm, nothing beats practical learning. ${He} learns how to grow cops and how to care for farm animals.`; + } else if (slave.skill.farmer <= 30) { + r += ` Having become familiar with farming, the tutor now has ${him} attend lectures on the science behind it. ${His} knowledge greatly increases due to this.`; + } else if (slave.skill.farmer <= 60) { + r += ` ${He} oversees a group of farmhands as they care for the animals and plow the fields. Having mastered farming, ${he}'s now training ${his} leadership skills.`; + } else if (slave.skill.farmer <= 100) { + r += ` The tutor has him lead an entire farm. ${He} manages every aspect, and does so admirably. ${He} is also introduced to a different side of slave farming, the "shows". It doesn't take long before ${he}'s overseeing those too...`; + } + r += ` ${SkillIncrease.Farmer(slave, skillIncrease)}`; + break; + case "Wardeness": + if (slave.skill.attendant <= 10) { + r += ` A tutor takes ${him} through basic self-defense and the safe use of prison equipment.`; + } else if (slave.skill.attendant <= 30) { + r += ` ${He} practices wrestling holds with a tutor, who also shows ${him} how to tie up resisting victims.`; + } else if (slave.skill.attendant <= 60) { + r += ` The correctional psychology lectures ${he} watches this week are unburdened by ethics. ${He} learns how to handle prisoners more effectively.`; + } else if (slave.skill.attendant <= 100) { + r += `${He} gets to study enhanced interrogation techniques from an experienced tutor, with ample demonstrations on live subjects, including ${himself}.`; + } + r += ` ${SkillIncrease.Wardeness(slave, skillIncrease)}`; + break; + default: + r += `tutorLessons ERROR unknown skill`; + } + } else { + r += `You did not have enough credits for private tutoring.` + } + } + /** * @param {App.Entity.SlaveState} slave * @@ -476,26 +658,29 @@ App.SlaveAssignment.takeClasses = (function() { if ((slave.skill.entertainment > 30) || (V.schoolroomUpgradeSkills === 0 && slave.skill.entertainment > 10)) { if ((slave.skill.anal > 30) || (V.schoolroomUpgradeSkills === 0 && slave.skill.anal > 10)) { if ((slave.skill.vaginal > 30) || (V.schoolroomUpgradeSkills === 0 && slave.skill.vaginal > 10) || (slave.vagina < 0)) { - r += ` ${He} can learn little from further classes, <span class="noteworthy">`; - if (V.assignmentRecords[slave.ID]) { - let oldJob = V.assignmentRecords[slave.ID]; - assignJobSafely(slave, oldJob); - if (slave.choosesOwnAssignment === 1) { - r += ` so ${he} takes a break before choosing another task.`; - } else if (slave.assignment === Job.REST) { - if (oldJob !== Job.REST) { - r += ` and since ${he} was unable to return to ${his} old task to ${oldJob}, ${his} assignment has defaulted to rest.`; + if (tutorForSlave(slave) === null || V.tutorGraduate.includes(slave.ID)) { + V.tutorGraduate.delete(slave.ID); + r += ` ${He} can learn little from further classes, <span class="noteworthy">`; + if (V.assignmentRecords[slave.ID]) { + let oldJob = V.assignmentRecords[slave.ID]; + assignJobSafely(slave, oldJob); + if (slave.choosesOwnAssignment === 1) { + r += ` so ${he} takes a break before choosing another task.`; + } else if (slave.assignment === Job.REST) { + if (oldJob !== Job.REST) { + r += ` and since ${he} was unable to return to ${his} old job (${oldJob}), ${his} assignment has defaulted to rest.`; + } else { + r += ` so ${he} has returned to resting.`; + } } else { - r += ` so ${he} has returned to resting.`; + r += ` so ${he} goes back to ${oldJob}.`; } } else { - r += ` so ${he} goes back to ${oldJob}.`; + r += ` so ${his} assignment has defaulted to rest.`; + removeJob(slave, slave.assignment); } - } else { - r += ` so ${his} assignment has defaulted to rest.`; - removeJob(slave, slave.assignment); + r += `</span>`; } - r += `</span>`; } } } diff --git a/src/endWeek/schoolroomReport.js b/src/endWeek/schoolroomReport.js index 5a98eff826c44d82787978f1af915e1d459a4f76..ea0b28a34e6c7eb0f0f9feba31d3914ec4269f2f 100644 --- a/src/endWeek/schoolroomReport.js +++ b/src/endWeek/schoolroomReport.js @@ -176,7 +176,8 @@ App.EndWeek.schoolroomReport = function() { ((slave.skill.whoring > 30) || ((V.schoolroomUpgradeSkills === 0) && (slave.skill.whoring > 10))) && ((slave.skill.entertainment > 30) || ((V.schoolroomUpgradeSkills === 0) && (slave.skill.entertainment > 10))) && ((slave.skill.anal > 30) || ((V.schoolroomUpgradeSkills === 0) && (slave.skill.anal > 10))) && - ((slave.skill.vaginal > 30) || ((V.schoolroomUpgradeSkills === 0) && (slave.skill.vaginal > 10)) || (slave.vagina < 0)) ) { + ((slave.skill.vaginal > 30) || ((V.schoolroomUpgradeSkills === 0) && (slave.skill.vaginal > 10)) || (slave.vagina < 0)) && + (tutorForSlave(slave) === null || V.tutorGraduate.includes(slave.ID))) { const reassignment = App.UI.DOM.appendNewElement("p", frag, ''); const {he, his} = getPronouns(slave); let r = []; diff --git a/src/facilities/schoolroom/schoolroomFramework.js b/src/facilities/schoolroom/schoolroomFramework.js index 0676a003f17de5a89e004ed18fc1186a0bf19b57..e743bbcefd27a3dfb95a2fd31845c7c72cd808f2 100644 --- a/src/facilities/schoolroom/schoolroomFramework.js +++ b/src/facilities/schoolroom/schoolroomFramework.js @@ -49,7 +49,8 @@ App.Entity.Facilities.SchoolroomStudentJob = class extends App.Entity.Facilities if (((slave.intelligenceImplant >= 30 && V.schoolroomRemodelBimbo !== 1) || (slave.intelligenceImplant <= -15 && V.schoolroomRemodelBimbo === 1)) && (slave.voice === 0 || slave.accent + this.facility.upgrade("Language") <= 2) && (slave.skill.oral > maxSkill) && (slave.skill.whoring > maxSkill) && (slave.skill.entertainment > maxSkill) && - (slave.skill.anal > maxSkill) && ((slave.vagina < 0) || (slave.skill.vaginal > maxSkill))) { + (slave.skill.anal > maxSkill) && ((slave.vagina < 0) || (slave.skill.vaginal > maxSkill)) && + ((tutorForSlave(slave) === null) || (V.tutorGraduate.includes(slave.ID)))) { r.push(`${slave.slaveName} has nothing left to learn.`); } diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw index c6360d21273c43f080c84bee23c856278bd4feb4..ee0a928cee55fdedf73434c32b86177c56d446ab 100644 --- a/src/gui/Encyclopedia/encyclopedia.tw +++ b/src/gui/Encyclopedia/encyclopedia.tw @@ -2828,7 +2828,7 @@ LORE: INTERVIEWS <br>''lowercasedonkey'' for various additions, not limited to the budget overhauls. Set up all the tabs too. Gave events dynamic vector art. Hammered the scarring and branding systems into place. Been a real boon writing events and other things as well. Used ezsh's facility framework to enhance slave summaries. Set up a system to recall where slaves were serving. Striving to master DOM with great gains. <br>''amomynous0'' for bug reports and testing in addition to SFmod unit descriptions. <br>''wepsrd'' for QOL (hormonal balance cheat and lactation adaptation to new menu) fixes. - <br>''i107760'' for Costs Budget, CashX work, The Utopian Orphanage and Farmyard work. + <br>''i107760'' for Costs Budget, CashX work, The Utopian Orphanage, Farmyard, Special Forces work, various QoL additions and Private Tutoring System. <br><br>''Many other anonymous contributors'' helped fix bugs via GitHub. They will be credited by name upon request. diff --git a/src/interaction/slaveInteract.js b/src/interaction/slaveInteract.js index 721535348bc1ae9056fc549f46777eca137386da..79246bd04c1e560e4fb404bb357f50c1a2db64a8 100644 --- a/src/interaction/slaveInteract.js +++ b/src/interaction/slaveInteract.js @@ -315,6 +315,8 @@ App.UI.SlaveInteract.work = function(slave) { el.append(div); } + el.append(App.UI.SlaveInteract.tutorBlock(slave)); + function generateLink(linkDesc) { // is it just text? if (linkDesc.disabled) { return App.UI.DOM.disabledLink(linkDesc.text, [linkDesc.disabled]); } @@ -408,6 +410,63 @@ App.UI.SlaveInteract.assignmentBlock = function(slave) { return el; }; +/** + * @param {App.Entity.SlaveState} slave + * @returns {HTMLDivElement} + */ +App.UI.SlaveInteract.tutorBlock = function(slave) { + let el = App.UI.DOM.makeElement("div"); + let title = App.UI.DOM.appendNewElement("div", el, `Private tutoring: `); + let tutor = tutorForSlave(slave); + + if (tutor === null) { + App.UI.DOM.appendNewElement("span", title, `none.`, "bold"); + } else { + App.UI.DOM.appendNewElement("span", title, tutor + `.`, "bold"); + } + + if (tutor != null) { + App.UI.DOM.appendNewElement("span", title, ` To progress slave needs to be assigned to: "` + Job.CLASSES + `" or "` + Job.SCHOOL + `".`, "note"); + } + + let list = ["None"]; + for (const keys of Object.keys(V.slaveTutor)) { + list.push(keys); + } + const array = list.map((s) => { + if (shouldBeEnabled(slave, s)) { + return App.UI.DOM.link(s, () => setTutorForSlave(slave,s)); + } else { + let reason = ["Already being taught this skill."]; + return App.UI.DOM.disabledLink(s, reason); + } + }); + App.UI.DOM.appendNewElement("div", el, App.UI.DOM.generateLinksStrip(array)); + + function shouldBeEnabled(slave, key) { + let tutor = tutorForSlave(slave); + if (tutor === null) { + return "None"; + } + return (tutor != key); + } + + function setTutorForSlave(slave, tutor) { + const cur = tutorForSlave(slave); + + if (tutor != cur && cur != null) { + V.slaveTutor[cur].delete(slave.ID); + } + + if (cur != tutor && tutor != "None") { + V.slaveTutor[tutor].push(slave.ID); + } + App.UI.SlaveInteract.work(slave); + } + + return el; +} + App.UI.SlaveInteract.drugs = function(slave) { let el = document.createElement('div'); diff --git a/src/js/utilsFC.js b/src/js/utilsFC.js index 078f647039cbdfdafc67e166c1fe6c6e003a2f05..7269cfb1798b1070c32ab413a40a4fa274d2fb17 100644 --- a/src/js/utilsFC.js +++ b/src/js/utilsFC.js @@ -2218,13 +2218,26 @@ globalThis.SkillIncrease = (function() { Vaginal: VaginalSkillIncrease, Anal: AnalSkillIncrease, Whore: WhoreSkillIncrease, - Entertain: EntertainSkillIncrease + Entertain: EntertainSkillIncrease, + HeadGirl: HeadGirlSkillIncrease, + Recruiter: RecruiterSkillIncrease, + Bodyguard: BodyguardSkillIncrease, + Madam: MadamSkillIncrease, + DJ: DJSkillIncrease, + Nurse: NurseSkillIncrease, + Teacher: TeacherSkillIncrease, + Attendant: AttendantSkillIncrease, + Matron: MatronSkillIncrease, + Stewardess: StewardessSkillIncrease, + Milkmaid: MilkmaidSkillIncrease, + Farmer: FarmerSkillIncrease, + Wardeness: WardenessSkillIncrease }; /* call as SkillIncrease.Oral() */ /** * @param {App.Entity.SlaveState} slave - * @param {number} skillIncrease // I think + * @param {number} [skillIncrease=1] * @returns {string} */ function OralSkillIncrease(slave, skillIncrease = 1) { @@ -2255,7 +2268,7 @@ globalThis.SkillIncrease = (function() { /* call as SkillIncrease.Vaginal() */ /** * @param {App.Entity.SlaveState} slave - * @param {number} skillIncrease // I think + * @param {number} [skillIncrease=1] * @returns {string} */ function VaginalSkillIncrease(slave, skillIncrease = 1) { @@ -2286,7 +2299,7 @@ globalThis.SkillIncrease = (function() { /* call as SkillIncrease.Anal() */ /** * @param {App.Entity.SlaveState} slave - * @param {number} skillIncrease // I think + * @param {number} [skillIncrease=1] * @returns {string} */ function AnalSkillIncrease(slave, skillIncrease = 1) { @@ -2317,7 +2330,7 @@ globalThis.SkillIncrease = (function() { /* call as SkillIncrease.Whore() */ /** * @param {App.Entity.SlaveState} slave - * @param {number} skillIncrease // I think + * @param {number} [skillIncrease=1] * @returns {string} */ function WhoreSkillIncrease(slave, skillIncrease = 1) { @@ -2348,7 +2361,7 @@ globalThis.SkillIncrease = (function() { /* call as SkillIncrease.Entertain() */ /** * @param {App.Entity.SlaveState} slave - * @param {number} skillIncrease // I think + * @param {number} [skillIncrease=1] * @returns {string} */ function EntertainSkillIncrease(slave, skillIncrease = 1) { @@ -2375,8 +2388,448 @@ globalThis.SkillIncrease = (function() { slave.skill.entertainment += skillIncrease; return r; } + + /* call as SkillIncrease.HeadGirl() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function HeadGirlSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.headGirl <= 10) { + if (slave.skill.headGirl + skillIncrease > 10) { + r = `<span class="green">${He} now has basic HeadGirl skills.</span>`; + } + } else if (slave.skill.headGirl <= 30) { + if (slave.skill.headGirl + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a HeadGirl.</span>`; + } + } else if (slave.skill.headGirl <= 60) { + if (slave.skill.headGirl + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert HeadGirl.</span>`; + } + } else if (slave.skill.headGirl < 100) { + if (slave.skill.headGirl + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful HeadGirl.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["HeadGirl"].delete(slave.ID); + } + } + slave.skill.headGirl += skillIncrease; + return r; + } + + /* call as SkillIncrease.Recruiter() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function RecruiterSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.recruiter <= 10) { + if (slave.skill.recruiter + skillIncrease > 10) { + r = `<span class="green">${He} now has basic Recruiter skills.</span>`; + } + } else if (slave.skill.recruiter <= 30) { + if (slave.skill.recruiter + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a Recruiter.</span>`; + } + } else if (slave.skill.recruiter <= 60) { + if (slave.skill.recruiter + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert Recruiter.</span>`; + } + } else if (slave.skill.recruiter < 100) { + if (slave.skill.recruiter + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful Recruiter.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["Recruiter"].delete(slave.ID); + } + } + slave.skill.recruiter += skillIncrease; + return r; + } + + /* call as SkillIncrease.Bodyguard() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function BodyguardSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.bodyguard <= 10) { + if (slave.skill.bodyguard + skillIncrease > 10) { + r = `<span class="green">${He} now has basic Bodyguard skills.</span>`; + } + } else if (slave.skill.bodyguard <= 30) { + if (slave.skill.bodyguard + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a Bodyguard.</span>`; + } + } else if (slave.skill.bodyguard <= 60) { + if (slave.skill.bodyguard + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert Bodyguard.</span>`; + } + } else if (slave.skill.bodyguard < 100) { + if (slave.skill.bodyguard + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful Bodyguard.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["Bodyguard"].delete(slave.ID); + slave.skill.combat = 1; + } + } + slave.skill.bodyguard += skillIncrease; + return r; + } + + /* call as SkillIncrease.Madam() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function MadamSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.madam <= 10) { + if (slave.skill.madam + skillIncrease > 10) { + r = `<span class="green">${He} now has basic Madam skills.</span>`; + } + } else if (slave.skill.madam <= 30) { + if (slave.skill.madam + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a Madam.</span>`; + } + } else if (slave.skill.madam <= 60) { + if (slave.skill.madam + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert Madam.</span>`; + } + } else if (slave.skill.madam < 100) { + if (slave.skill.madam + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful Madam.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["Madam"].delete(slave.ID); + } + } + slave.skill.madam += skillIncrease; + return r; + } + + /* call as SkillIncrease.DJ() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function DJSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.DJ <= 10) { + if (slave.skill.DJ + skillIncrease > 10) { + r = `<span class="green">${He} now has basic DJ skills.</span>`; + } + } else if (slave.skill.DJ <= 30) { + if (slave.skill.DJ + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a DJ.</span>`; + } + } else if (slave.skill.DJ <= 60) { + if (slave.skill.DJ + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert DJ.</span>`; + } + } else if (slave.skill.DJ < 100) { + if (slave.skill.DJ + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful DJ.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["DJ"].delete(slave.ID); + } + } + slave.skill.DJ += skillIncrease; + return r; + } + + /* call as SkillIncrease.Nurse() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function NurseSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.nurse <= 10) { + if (slave.skill.nurse + skillIncrease > 10) { + r = `<span class="green">${He} now has basic Nurse skills.</span>`; + } + } else if (slave.skill.nurse <= 30) { + if (slave.skill.nurse + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a Nurse.</span>`; + } + } else if (slave.skill.nurse <= 60) { + if (slave.skill.nurse + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert Nurse.</span>`; + } + } else if (slave.skill.nurse < 100) { + if (slave.skill.nurse + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful Nurse.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["Nurse"].delete(slave.ID); + } + } + slave.skill.nurse += skillIncrease; + return r; + } + + /* call as SkillIncrease.Teacher() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function TeacherSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.teacher <= 10) { + if (slave.skill.teacher + skillIncrease > 10) { + r = `<span class="green">${He} now has basic Teacher skills.</span>`; + } + } else if (slave.skill.teacher <= 30) { + if (slave.skill.teacher + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a Teacher.</span>`; + } + } else if (slave.skill.teacher <= 60) { + if (slave.skill.teacher + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert Teacher.</span>`; + } + } else if (slave.skill.teacher < 100) { + if (slave.skill.teacher + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful Teacher.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["Teacher"].delete(slave.ID); + } + } + slave.skill.teacher += skillIncrease; + return r; + } + + /* call as SkillIncrease.Attendant() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function AttendantSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.attendant <= 10) { + if (slave.skill.attendant + skillIncrease > 10) { + r = `<span class="green">${He} now has basic Attendant skills.</span>`; + } + } else if (slave.skill.attendant <= 30) { + if (slave.skill.attendant + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a Attendant.</span>`; + } + } else if (slave.skill.attendant <= 60) { + if (slave.skill.attendant + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert Attendant.</span>`; + } + } else if (slave.skill.attendant < 100) { + if (slave.skill.attendant + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful Attendant.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["Attendant"].delete(slave.ID); + } + } + slave.skill.attendant += skillIncrease; + return r; + } + + /* call as SkillIncrease.Matron() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function MatronSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.matron <= 10) { + if (slave.skill.matron + skillIncrease > 10) { + r = `<span class="green">${He} now has basic Matron skills.</span>`; + } + } else if (slave.skill.matron <= 30) { + if (slave.skill.matron + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a Matron.</span>`; + } + } else if (slave.skill.matron <= 60) { + if (slave.skill.matron + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert Matron.</span>`; + } + } else if (slave.skill.matron < 100) { + if (slave.skill.matron + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful Matron.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["Matron"].delete(slave.ID); + } + } + slave.skill.matron += skillIncrease; + return r; + } + + /* call as SkillIncrease.Stewardess() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function StewardessSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.stewardess <= 10) { + if (slave.skill.stewardess + skillIncrease > 10) { + r = `<span class="green">${He} now has basic Stewardess skills.</span>`; + } + } else if (slave.skill.stewardess <= 30) { + if (slave.skill.stewardess + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a Stewardess.</span>`; + } + } else if (slave.skill.stewardess <= 60) { + if (slave.skill.stewardess + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert Stewardess.</span>`; + } + } else if (slave.skill.stewardess < 100) { + if (slave.skill.stewardess + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful Stewardess.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["Stewardess"].delete(slave.ID); + } + } + slave.skill.stewardess += skillIncrease; + return r; + } + + /* call as SkillIncrease.Milkmaid() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function MilkmaidSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.milkmaid <= 10) { + if (slave.skill.milkmaid + skillIncrease > 10) { + r = `<span class="green">${He} now has basic Milkmaid skills.</span>`; + } + } else if (slave.skill.milkmaid <= 30) { + if (slave.skill.milkmaid + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a Milkmaid.</span>`; + } + } else if (slave.skill.milkmaid <= 60) { + if (slave.skill.milkmaid + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert Milkmaid.</span>`; + } + } else if (slave.skill.milkmaid < 100) { + if (slave.skill.milkmaid + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful Milkmaid.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["Milkmaid"].delete(slave.ID); + } + } + slave.skill.milkmaid += skillIncrease; + return r; + } + + /* call as SkillIncrease.Farmer() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function FarmerSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.farmer <= 10) { + if (slave.skill.farmer + skillIncrease > 10) { + r = `<span class="green">${He} now has basic Farmer skills.</span>`; + } + } else if (slave.skill.farmer <= 30) { + if (slave.skill.farmer + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a Farmer.</span>`; + } + } else if (slave.skill.farmer <= 60) { + if (slave.skill.farmer + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert Farmer.</span>`; + } + } else if (slave.skill.farmer < 100) { + if (slave.skill.farmer + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful Farmer.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["Farmer"].delete(slave.ID); + } + } + slave.skill.farmer += skillIncrease; + return r; + } + + /* call as SkillIncrease.Wardeness() */ + /** + * @param {App.Entity.SlaveState} slave + * @param {number} [skillIncrease=1] + * @returns {string} + */ + function WardenessSkillIncrease(slave, skillIncrease = 1) { + const {He} = getPronouns(slave); + let r = ""; + + if (slave.skill.wardeness <= 10) { + if (slave.skill.wardeness + skillIncrease > 10) { + r = `<span class="green">${He} now has basic Wardeness skills.</span>`; + } + } else if (slave.skill.wardeness <= 30) { + if (slave.skill.wardeness + skillIncrease > 30) { + r = `<span class="green">${He} now has some skill as a Wardeness.</span>`; + } + } else if (slave.skill.wardeness <= 60) { + if (slave.skill.wardeness + skillIncrease > 60) { + r = `<span class="green">${He} is now an expert Wardeness.</span>`; + } + } else if (slave.skill.wardeness < 100) { + if (slave.skill.wardeness + skillIncrease >= 100) { + r = `<span class="green">${He} is now a masterful Wardeness.</span>`; + V.tutorGraduate.push(slave.ID); + V.slaveTutor["Wardeness"].delete(slave.ID); + } + } + slave.skill.wardeness += skillIncrease; + return r; + } })(); +globalThis.tutorForSlave = function(slave) { + for (const tutor of Object.keys(V.slaveTutor)) { + const pupils = V.slaveTutor[tutor]; + if (pupils.contains(slave.ID)) { + return tutor; + } + } + return null; +} + globalThis.upgradeMultiplier = function(skill) { if (skill === 'medicine' && V.PC.career === "medicine" || skill === 'engineering' && V.PC.career === "engineer" || ((skill === 'medicine' || skill === 'engineering') && V.arcologies[0].FSRestartDecoration >= 100 && V.eugenicsFullControl === 0)) {