diff --git a/src/004-base/facility.js b/src/004-base/facility.js index 041e190e1d8bb3a757a6c015ef26426be49ea14d..08b59e59f07a10b49aef7c6a46559af081014c95 100644 --- a/src/004-base/facility.js +++ b/src/004-base/facility.js @@ -1,14 +1,23 @@ -App.Data.PositionDesc = class { +App.Data.JobDesc = class { constructor() { this.position = ""; this.assignment = ""; + this.publicSexUse = false; + this.fuckdollAccepted = false; + this.broodmotherAccepted = false; } } -App.Data.ManagerPositionDesc = class extends App.Data.PositionDesc { +App.Data.ManagerJobDesc = class extends App.Data.JobDesc { constructor() { super(); + this.shouldWalk = true; + this.shouldSee = true; + this.shouldHear = true; + this.shouldTalk = true; + this.shouldThink = true; + this.requiredDevotion = 50; /** * Applicable careers * @type {string[]} */ @@ -25,35 +34,219 @@ App.Data.FacilityDesc = class { /** Base name for state variables */ this.baseName = ""; /** Generic name for UI (Brothel, Club, etc.) - * If null, baseName will be used instead + * If null, baseName is used instead */ this.genericName = ""; - /** @type {App.Data.PositionDesc} */ - this.assignee = null; - /** @type {App.Data.PositionDesc} */ - this.penthouse = null; - /** @type {App.Data.ManagerPositionDesc} */ + /** @type {Object.<string, App.Data.JobDesc>} */ + this.jobs = {}; + this.defaultJob = ""; + /** @type {App.Data.ManagerJobDesc} */ this.manager = null; } } App.Data.Facilities = {}; - App.Entity.Facilities = {}; -App.Entity.Facilities.Facility = class { +App.Entity.Facilities.Job = class { + constructor() { + /** @type {App.Data.JobDesc} */ + this.desc = null; + /** @type {App.Entity.Facilities.Facility} */ + this.facility = null; + } + + /** + * Can slave be employed at this position + * @param {App.Entity.SlaveState} slave + * @returns {string[]} + */ + canEmploy(slave) { + let r = []; + if (this.isEmployed(slave)) { + r.push(`${slave.slaveName} is already assigned to ${this.desc.assignment} at ${this.facility.name}.`); + return r; + } + if (!this._facilityHasFreeSpace) { + r.push(`Capacity of ${this.facility.name} exceeded.`); + } + if (slave.assignment === this.desc.assignment) { + r.push(`${slave.slaveName} is already assigned to ${this.desc.assignment}.`); + } + if (this.desc.publicSexUse && + (slave.breedingMark === 1 && State.variables.propOutcome === 1)) { + r.push(`${slave.slaveName} is for private use only.`); + } + if (!this.desc.fuckdollAccepted && slave.fuckdoll > 0) { + r.push(`Fuckdolls can't ${this.desc.assignment} at ${this.facility.name}.`); + } + if (!this.desc.broodmotherAccepted && slave.preg > 37 && slave.broodmother === 2) { + r.push(`Birthing broodmothers can't ${this.desc.assignment}.`); + } + return r; + } + + /** + * Is slave already assigned to this job + * @param {App.Entity.SlaveState} slave + * @returns {boolean} + */ + isEmployed(slave) { + return slave.assignment === this.desc.assignment; + } + + /** + * + * @callback linkCallback + * @param {string} assignment new assignment + * @returns {string} code to include into the <<link>><</link> + */ + + /** + * Returns link text for the penthhouse assignment + * @param {number} i slave index + * @param {string} [passage] passage to go to + * @param {linkCallback} [callback] + * @param {string} [linkText] + * @returns {string} + */ + assingmentLink(i, passage, callback, linkText) { + linkText = linkText || this.desc.position; + const linkAction = callback !== undefined ? callback(this.desc.assignment) : ''; + return `<<link "${linkText}"${passage !== undefined ? ' "' + passage + '"' : ''}>><<= assignJob(${App.Utils.slaveRefString(i)}, "${this.desc.assignment}")>>${linkAction}<</link>>`; + } + + /** + * Tests is slave broken enought + * @protected + * @param {App.Entity.SlaveState} slave + * @param {number} [pureDevotion=50] Minimal devotion level to pass test with any trust + * @param {number} [devotion=-50] Minimal devotion for slaves with enough fear + * @param {number} [trust=-21] Maximal trust (i.e. minimal fear) for the less devotional (see above) + * @param {number} [pureFear=-51] Maximal low trust to pass test with any devotion (because of the fear) + * @param {number} [pureTrust=101] Minimal high trust level to pass test without devotion + * @returns {boolean} + */ + static _isBrokenEnough(slave, pureDevotion, devotion, trust, pureFear, pureTrust) { + if ((slave.devotion < (pureDevotion || 50)) && + (slave.trust < (pureTrust || 101)) && (slave.trust > (pureFear || -51)) && + ((slave.devotion <= (devotion || -51)) || (slave.trust >= (trust || -21)))) { + return false; + } + return true; + } + + /** + * @protected + * Standard message that slave is not broken enough + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ + static _stdBreakageMessage(slave) { + return `${slave.slaveName} must be either more fearful of you or devoted to you.`; + } + + /** + * @private + */ + get _facilityHasFreeSpace() { + return this.facility.hasFreeSpace; + } +} + +App.Entity.Facilities.ManagingJob = class extends App.Entity.Facilities.Job { + constructor() { + super(); + /** @type {App.Data.ManagerJobDesc} */ + this.desc = null; + } + + /** + * Can slave be employed at this position + * @param {App.Entity.SlaveState} slave + * @returns {string[]} + */ + canEmploy(slave) { + let r = super.canEmploy(slave); + if (slave.devotion < this.desc.requiredDevotion) { + r.push(`${slave.slaveName} must be more devoted to you.`); + } + if (this.desc.shouldWalk && !canWalk(slave)) { + r.push(`${slave.slaveName} must be able to walk.`); + } + if (this.desc.shouldSee && !canSee(slave)) { + r.push(`${slave.slaveName} must have working eyes.`); + } + if (this.desc.shouldHear && !canHear(slave)) { + r.push(`${slave.slaveName} must be able to hear.`); + } + if (this.desc.shouldTalk && !canTalk(slave)) { + r.push(`${slave.slaveName} must be able to talk.`); + } + if (this.desc.shouldThink && slave.fetish === "mindbroken") { + r.push(`${slave.slaveName} must possess cognition.`); + } + return r; + } + /** + * Returns true if slave has enough applicable skill or career + * @param {App.Entity.SlaveState} slave + * @returns {boolean} + */ + slaveHasExperience(slave) { + return (this.desc.skill !== null && slave.skill[this.desc.skill] >= State.variables.masteredXP) || + (typeof slave.career === 'string' && this.desc.careers.includes(slave.career)); + } + + /** + * @private + */ + get _facilityHasFreeSpace() { + return true; + } +} +App.Entity.Facilities.Facility = class { /** * @param {App.Data.FacilityDesc} desc defines state variable for this facility + * @param {Object.<string, App.Entity.Facilities.Job>} [jobs] job object that are not default + * @param {App.Entity.Facilities.ManagingJob} [manager] */ - constructor(desc) { + constructor(desc, jobs, manager) { this.desc = desc; + jobs = jobs || {}; + /** @private @type {Object.<string, App.Entity.Facilities.Job>} */ + this._jobs = {}; + + // if this facility provides only a single job + const singleJobFacility = Object.keys(this.desc.jobs).length === 1; + for (const jn in this.desc.jobs) { + if (jobs[jn] !== undefined) { + this._jobs[jn] = jobs[jn]; + } else { + this._jobs[jn] = singleJobFacility ? new App.Entity.Facilities.FacilitySingleJob() : new App.Entity.Facilities.Job(); + } + this._jobs[jn].facility = this; + this._jobs[jn].desc = desc.jobs[jn]; + } + + if (manager === undefined) { + // default manager job implementation + manager = (this.desc.manager !== null) ? new App.Entity.Facilities.ManagingJob() : null; + } + /** @private */ + this._manager = manager; + if (this._manager !== null) { + this._manager.facility = this; + this._manager.desc = this.desc.manager; + } } /** Facility display name * @returns {string} */ get name() { - return State.variables[this.desc.baseName + "Name"]; + const res = State.variables[this.desc.baseName + "Name"]; + return res !== undefined ? res : 'the ' + this.genericName; } /** Facility generic name ("Brothel", "Schoolroom", etc.) @@ -62,8 +255,24 @@ App.Entity.Facilities.Facility = class { return this.desc.genericName !== null ? this.desc.genericName : capFirstChar(this.desc.baseName); } - get penthouseJob() { - return this.desc.penthouse !== null ? this.desc.penthouse.position : undefined; + /** All jobs at this facility + * @returns {string[]} + */ + get jobsNames() { + return Object.keys(this.desc.jobs); + } + + /** + * Returns job description + * @param {string} name + * @returns {App.Entity.Facilities.Job} + */ + job(name) { + return this._jobs[name]; + } + + get manager() { + return this._manager; } /** Facility slave capacity @@ -76,10 +285,6 @@ App.Entity.Facilities.Facility = class { return this.capacity > 0; } - get penthouseAssignmentAvailable() { - return this.desc.penthouse !== null; - } - /** Number of already hosted slaves * @returns {number} */ get hostedSlaves() { @@ -109,151 +314,95 @@ App.Entity.Facilities.Facility = class { } /** - * + * Can this facility host the given slave * @param {App.Entity.SlaveState} slave + * @param {string} [job] * @returns {string[]} array with rejection reasons. Slave can be hosted if this is empty. */ - canHostSlave(slave) { - let r = []; - if (!this.hasFreeSpace) { - r.push(`Capacity of ${this.name} exceeded`); + canHostSlave(slave, job) { + job = job || this.desc.defaultJob; + const j = this.job(job); + if (j === undefined) { + console.log(`Can't find job ${job} at ${this.name}.`); // eslint-disable-line no-console } - - if (slave.assignment === this.desc.assignee.assignment) { - r.push(`${slave.slaveName} is already at ${this.name}`); + // if there are more than one jobs at this facility, test them too + if (Object.keys(this.desc.jobs).length > 1 && this.isHosted(slave)) { + return [`${slave.slaveName} is already assigned to ${slave.assignment} at ${this.name}.`]; } - + let r = j.canEmploy(slave); return r; } /** + * Does the given slave work at this facility * @param {App.Entity.SlaveState} slave - * @returns {string[]} array with rejection reasons. Slave can be hosted if this is empty. + * @returns {boolean} */ - slaveCanWorkFromPenthouse(slave) { - let r = []; - if (slave.assignment === this.desc.penthouse.assignment) { - r.push(`${slave.slaveName} is already assigned to ${this.desc.penthouse.assignment}`); + isHosted(slave) { + for (const j in this._jobs) { + if (this._jobs[j].isEmployed(slave)) return true; } - return r; - } - - /** - * - * @callback linkCallback - * @param {string} assignment new assignment - * @returns {string} code to include into the <<link>><</link> - */ - /** - * Returns link text for the penthhouse assignment - * @param {number} i slave index - * @param {string} [passage] passage to go to - * @param {linkCallback} [callback] - * @returns {string} - */ - penthouseAssignmentLink(i, passage, callback) { - const linkAction = callback !== undefined ? callback(this.desc.penthouse.assignment) : ''; - return `<<link "${this.desc.penthouse.position}"${passage !== undefined ? ' "' + passage + '"' : ''}>><<= assignJob(${App.Utils.slaveRefString(i)}, "${this.desc.penthouse.assignment}")>>${linkAction}<</link>>`; + return false; } /** - * Returns link text for the facility transfer + * Returns link text for the job assignments * @param {number} i slave index - * @returns {string} - */ - transferLink(i) { - return `[[${this.genericName}|Assign][$assignTo = "${this.genericName}", $i = ${i}]]` - } - - /** - * Returns true if slave has enough applicable skill or career - * @param {App.Entity.SlaveState} slave - * @returns {boolean} - */ - slaveHasExperiancedForManagerPosition(slave) { - return (this.desc.manager.skill !== null && slave.skill[this.desc.manager.skill] >= State.variables.masteredXP) || - (typeof slave.career === 'string' && this.desc.manager.careers.includes(slave.career)); - } - - /** - * Tests is slave broken enought - * @protected - * @param {App.Entity.SlaveState} slave - * @param {number} [pureDevotion=50] Minimal devotion level to pass test with any trust - * @param {number} [devotion=-50] Minimal devotion for slaves with enough fear - * @param {number} [trust=-21] Maximal trust (i.e. minimal fear) for the less devotional (see above) - * @param {number} [pureFear=-51] Maximal low trust to pass test with any devotion (because of the fear) - * @param {number} [pureTrust=101] Minimal high trust level to pass test without devotion - * @returns {boolean} + * @param {string} [job] generate link only for this job + * @param {string} [passage] + * @param {linkCallback} callback + * @returns {string[]} */ - static _isBrokenEnough(slave, pureDevotion, devotion, trust, pureFear, pureTrust) { - if ((slave.devotion < (pureDevotion || 50)) && - (slave.trust < (pureTrust || 101)) && (slave.trust > (pureFear || -51)) && - ((slave.devotion <= (devotion || -51)) || (slave.trust >= (trust || -21)))) { - return false; + assignmentLinks(i, job, passage, callback) { + /** @type {App.Entity.SlaveState} */ + const slave = App.Utils.slaveByIndex(i); + const jobs = job === undefined ? this._jobs : {job: this._jobs[job]}; + + let res = [] + for (const jn in jobs) { + const j = jobs[jn]; + let rejects = j.canEmploy(slave); + if (rejects.length === 0) { + res.push(j.assingmentLink(i, passage, callback)); + } else { + res.push(App.UI.disabledLink(j.desc.position, rejects)); + } } - return true; + return res } /** - * @protected - * Standard message that slave is not broken enough - * @param {App.Entity.SlaveState} slave + * Returns link text for the facility transfer + * @param {number} i slave index + * @param {string} [job] transfer to this job (uses default job if this is undefined) + * @param {string} [passage] + * @param {linkCallback} [callback] * @returns {string} */ - static _stdBreakageMessage(slave) { - return `${slave.slaveName} must be either more fearful of you or devoted to you`; + transferLink(i, job, passage, callback) { + job = job || this.desc.defaultJob; + return this._jobs[job].assingmentLink(i, passage, callback, this.genericName); } } -App.Entity.Facilities.SexWorkFacility = class extends App.Entity.Facilities.Facility { +/** + * Job for a facility with a single job option + */ +App.Entity.Facilities.FacilitySingleJob = class extends App.Entity.Facilities.Job { /** - * @param {App.Data.FacilityDesc} desc - * @param {boolean} publicSexUse - * @param {boolean} fuckdollsAccepted - */ - constructor(desc, publicSexUse, fuckdollsAccepted) { - super(desc); - this.publicSexUse = publicSexUse; - this.fuckdollsAccepted = fuckdollsAccepted; - } - - /** - * - * @param {App.Entity.SlaveState} slave - * @returns {string[]} - */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); - - if (this.publicSexUse && - (slave.breedingMark === 1 || State.variables.propOutcome === 1)) { - r.push(`${slave.slaveName} is for private use only`); - } - - if (!this.fuckdollsAccepted && slave.fuckdoll > 0) { - r.push(`Fuckdolls can't work at ${this.name}`); - } - return r; - } - - /** - * @param {App.Entity.SlaveState} slave - * @returns {string[]} array with rejection reasons. Slave can be hosted if this is empty. + * Returns link text for the penthhouse assignment + * @param {number} i slave index + * @param {string} [passage] passage to go to + * @param {linkCallback} [callback] + * @param {string} [linkText] + * @returns {string} */ - slaveCanWorkFromPenthouse(slave) { - let r = super.slaveCanWorkFromPenthouse(slave); - - if (this.publicSexUse && - (slave.breedingMark === 1 || State.variables.propOutcome === 1)) { - r.push(`${slave.slaveName} is for private use only`); - } - - if (!this.fuckdollsAccepted && slave.fuckdoll > 0) { - r.push(`Fuckdolls can't ${this.desc.penthouse.assignment}`); - } - return r; + assingmentLink(i, passage, callback, linkText) { + linkText = linkText || this.facility.genericName; + const linkAction = callback !== undefined ? callback(this.desc.assignment) : ''; + const psg = passage === undefined ? '' : `, $returnTo = "${passage}"`; + return `<<link "${linkText}" "Assign">><<set $assignTo = "${this.facility.genericName}", $i = ${i}${psg}>>${linkAction}<</link>>`; } } diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js index 51252a283c1d8b28791671ff8df38a2597892a72..91a818e2e3f9bc326669d62bcf3a37661345c3ec 100644 --- a/src/endWeek/saWhore.js +++ b/src/endWeek/saWhore.js @@ -37,11 +37,11 @@ window.saWhore = (function saWhore() { girl === "girl" ? loli = "loli" : loli = "shota"; gatherStatistics(slave); + updateNonSlaveVariables(slave); // must be run before applyFSDecoration() or you will face NaNs if (slave.assignment === "work in the brothel") { // By being at the end, every slave after the first will get a bonus. By moving it up, the first can enjoy it too. slaveJobValues() checks Edo Rivalist, so here we are. applyFSDecoration(slave); } - updateNonSlaveVariables(slave); addCash(slave); sexCounts(slave); jobPreface(slave); @@ -71,7 +71,7 @@ window.saWhore = (function saWhore() { /** @param {App.Entity.SlaveState} slave */ function gatherStatistics(slave) { /* Statistics gathering */ - const facility = slave.assignment === Job.Brothel ? V.facility.brothel : undefined; + const facility = slave.assignment === Job.BROTHEL ? V.facility.brothel : undefined; T.incomeStats = getSlaveStatisticData(slave, facility); } diff --git a/src/events/gameover.tw b/src/events/gameover.tw index 4b62c2d887f008e134dd8146fe534550cca6e6a6..be715635b6f3e0be4be27313cdadf5ebf784e867 100644 --- a/src/events/gameover.tw +++ b/src/events/gameover.tw @@ -1,94 +1,93 @@ :: Gameover [nobr] -<<if $gameover == "bombing">> - <<set $ui = "start">> - One fine day, you're strolling down the main promenade, making your usual combined inspection and public rounds. These walks are triply useful, since they allow you to keep a finger on the pulse of your demesne, identify any problems, and display yourself to the population. - <br><br> - <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> suddenly relays a silent alarm, highlighting a scruffy individual twenty <<if $showInches == 2>>yards<<else>>meters<</if>> ahead. This person is hooded and acting oddly. You catch a glance from beneath the hood in your direction: and the figure obviously decides that it can get no closer to you. Your assistant's scanning detects the presence of an implanted bomb moments before the suicide bomber detonates themselves. - <br><br> - The implanted bomb is small, and went off too far ahead to do anything more than stun. Three other assailants run at you from where they were waiting in the confusion, wielding improvised weapons that apparently did not set off the security scanners. Without a bodyguard, decent security systems, or any other means of personal defense, you meet your ignominious death at the end of a bludgeon fashioned from a maintenance tool. +<<switch $gameover>> + <<case "bombing">> + <<set $ui = "start">> + One fine day, you're strolling down the main promenade, making your usual combined inspection and public rounds. These walks are triply useful, since they allow you to keep a finger on the pulse of your demesne, identify any problems, and display yourself to the population. + <br><br> + <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> suddenly relays a silent alarm, highlighting a scruffy individual twenty <<if $showInches == 2>>yards<<else>>meters<</if>> ahead. This person is hooded and acting oddly. You catch a glance from beneath the hood in your direction: and the figure obviously decides that it can get no closer to you. Your assistant's scanning detects the presence of an implanted bomb moments before the suicide bomber detonates themselves. + <br><br> + The implanted bomb is small, and went off too far ahead to do anything more than stun. Three other assailants run at you from where they were waiting in the confusion, wielding improvised weapons that apparently did not set off the security scanners. Without a bodyguard, decent security systems, or any other means of personal defense, you meet your ignominious death at the end of a bludgeon fashioned from a maintenance tool. - <br><br> - ''GAME OVER'' -<<elseif $gameover == "idiot ball">> - <<set $ui = "start">> - <<setLocalPronouns $Bodyguard>> - You quickly move to deal $Bodyguard.slaveName a slap across the face. You have an instant to realize the depth of your folly as $his combat training kicks into gear: before $he realizes what $he's doing, $he has drawn $his sword, blocked your slap (and incidentally, removed your hand in doing so), and buried the sword in your chest on the riposte. $His devotion returns to $him as $his combat instincts subside. As you fade, you see $his eyes cloud with terrible, unhealable guilt; in one sure movement, $he draws $his weapon, sets it to semi-automatic, places it under $his chin, and fires a single round. + <br><br> + ''GAME OVER'' + <<case "idiot ball">> + <<set $ui = "start">> + <<setLocalPronouns $Bodyguard>> + You quickly move to deal $Bodyguard.slaveName a slap across the face. You have an instant to realize the depth of your folly as $his combat training kicks into gear: before $he realizes what $he's doing, $he has drawn $his sword, blocked your slap (and incidentally, removed your hand in doing so), and buried the sword in your chest on the riposte. $His devotion returns to $him as $his combat instincts subside. As you fade, you see $his eyes cloud with terrible, unhealable guilt; in one sure movement, $he draws $his weapon, sets it to semi-automatic, places it under $his chin, and fires a single round. - <br><br> - ''GAME OVER'' -<<elseif $gameover == "debt">> - <<set $ui = "start">> - You have fallen so far into debt that it is mere child's play for another slaveowner to purchase your debt, call it in, and enslave you. The story of your remaining years may be worth telling, but it must be told elsewhere. + <br><br> + ''GAME OVER'' + <<case "debt">> + <<set $ui = "start">> + You have fallen so far into debt that it is mere child's play for another slaveowner to purchase your debt, call it in, and enslave you. The story of your remaining years may be worth telling, but it must be told elsewhere. - <br><br> - ''GAME OVER'' -<<elseif $gameover == "birth complications">> - <<set $ui = "start">> - Again and again, you keep bearing down. As you grow more exhausted and are no closer to giving birth, you let out a feeble cry for help. - <br> - <br> - Some of your slaves rush to your aid, but they don't know what to do; they helplessly watch as you slowly fade away. If only you had someone you could rely on at your side, perhaps this could have been avoided. At last, the medics arrive at $assistantName's order, but it is too late to save you or your child<<if $PC.pregType > 1>>ren<</if>>. + <br><br> + ''GAME OVER'' + <<case "birth complications">> + <<set $ui = "start">> + Again and again, you keep bearing down. As you grow more exhausted and are no closer to giving birth, you let out a feeble cry for help. + <br> + <br> + Some of your slaves rush to your aid, but they don't know what to do; they helplessly watch as you slowly fade away. If only you had someone you could rely on at your side, perhaps this could have been avoided. At last, the medics arrive at $assistantName's order, but it is too late to save you or your child<<if $PC.pregType > 1>>ren<</if>>. - <br><br> - ''GAME OVER'' -<<elseif $gameover == "ownership">> - <<set $ui = "start">> - Since you no longer possess a controlling interest in an arcology, your time of influence and power in the Free Cities is over. You remain wealthy, and your life after the part of it worth telling is not something worth regretting. A retirement full of decadence awaits you. + <br><br> + ''GAME OVER'' + <<case "ownership">> + <<set $ui = "start">> + Since you no longer possess a controlling interest in an arcology, your time of influence and power in the Free Cities is over. You remain wealthy, and your life after the part of it worth telling is not something worth regretting. A retirement full of decadence awaits you. - <br><br> - ''GAME OVER'' -<<elseif $gameover == "sisters">> - <<set $ui = "start">> - For the first time in a long time, you feel the need to verbalize a response, telling the matron that yes, you will join them. She seems to understand, and takes you by the hand in a surprisingly familial gesture, leading you towards the orgy. She tells you she loves you, and all her Sisters echo her. After a moments' surprise, you tell them you love them too, and feminine hands reach out to draw you into their communion. A young futa sucks your cock and then feeds you your own cum from her mouth. An older futa with an enormous penis displaces her and makes out with you while she fucks your pussy. After she finishes inside you she slides your erection inside her own womanhood and rides you while a younger futa fucks your cleavage. You have a free hand which someone fills by pressing an enormous soft breast against it and you oblige her by massaging it eagerly. The futa matron's pussy grows suddenly tighter as another futa starts to buttfuck her and then looser as the cock is removed and inserted into your asshole instead. When she cums inside you she pulls out and her cock is replaced by a greedy mouth and tongue whose owner you cannot see. The older futa presses her cockhead into a younger Sister's mouth and orgasms before sliding herself under you so you can be on top instead. A futa whispers that she wants to be closer to you and slides her cock inside the matron's pussy alongside yours as she nestles her face between your breasts. - <br><br> - Your appointed successor arrives in your old office to find $assistantName ready to help them take control of the arcology. Most of your assets have been liquidated to create a huge endowment for $arcologies[0].name's Sisters. They'll never have to sell one of their own again, and will be able to afford all the advanced drugs and surgeries they desire. From the most matronly futa down to their newest Sister, none of them need concern themselves with anything other than sex. + <br><br> + ''GAME OVER'' + <<case "sisters">> + <<set $ui = "start">> + For the first time in a long time, you feel the need to verbalize a response, telling the matron that yes, you will join them. She seems to understand, and takes you by the hand in a surprisingly familial gesture, leading you towards the orgy. She tells you she loves you, and all her Sisters echo her. After a moments' surprise, you tell them you love them too, and feminine hands reach out to draw you into their communion. A young futa sucks your cock and then feeds you your own cum from her mouth. An older futa with an enormous penis displaces her and makes out with you while she fucks your pussy. After she finishes inside you she slides your erection inside her own womanhood and rides you while a younger futa fucks your cleavage. You have a free hand which someone fills by pressing an enormous soft breast against it and you oblige her by massaging it eagerly. The futa matron's pussy grows suddenly tighter as another futa starts to buttfuck her and then looser as the cock is removed and inserted into your asshole instead. When she cums inside you she pulls out and her cock is replaced by a greedy mouth and tongue whose owner you cannot see. The older futa presses her cockhead into a younger Sister's mouth and orgasms before sliding herself under you so you can be on top instead. A futa whispers that she wants to be closer to you and slides her cock inside the matron's pussy alongside yours as she nestles her face between your breasts. + <br><br> + Your appointed successor arrives in your old office to find $assistantName ready to help them take control of the arcology. Most of your assets have been liquidated to create a huge endowment for $arcologies[0].name's Sisters. They'll never have to sell one of their own again, and will be able to afford all the advanced drugs and surgeries they desire. From the most matronly futa down to their newest Sister, none of them need concern themselves with anything other than sex. - <br><br> - ''GAME OVER'' + <br><br> + ''GAME OVER'' + <<case "major battle defeat">> + <<set $ui = "start">> + <<if $attackType == "raiders">> + As the horde of raiders breaks the battle lines and enters the arcology, all hell breaks loose. You citizens are raped, your slaves captured and abused, your penthouse burned. + As for you, you are quickly captured and brought in front of the warlord himself. With a satisfied smile he aims his pistol to your forehead and squeezes the trigger. + <<elseif $attackType == "old world">> + As the interminable column of old world puppets breaks the battle lines and enters the arcology, all hell breaks loose. Properties are seized and wealth stolen and distributed between the victorious soldiers. + You are stripped of everything you possessed and left to rot in a corner of your once glorious arcology. + <<elseif $attackType == "freedom fighters">> + As the army of freedom fighters invades the arcology, all hell breaks loose. Their righteous fury torches everything you held dear, while the streets of the arcology run red with the blood of the masters. + You are reserved a special death: crucified in front of the arcology's entrance, your corpse a grim reminder of your legacy. + <<elseif $attackType == "free city">> + As the mercenaries break the battle lines and enter the arcology all hell breaks loose. The sectors are pillaged one by one, systematically and thoroughly. When they break in the penthouse they quickly capture and send you to their employers as proof of their success. + Your personal story may continue, but that part of it worthy of retelling has now ended. + <</if>> -<<elseif $gameover == "major battle defeat">> - <<set $ui = "start">> - <<if $attackType == "raiders">> - As the horde of raiders breaks the battle lines and enters the arcology, all hell breaks loose. You citizens are raped, your slaves captured and abused, your penthouse burned. - As for you, you are quickly captured and brought in front of the warlord himself. With a satisfied smile he aims his pistol to your forehead and squeezes the trigger. - <<elseif $attackType == "old world">> - As the interminable column of old world puppets breaks the battle lines and enters the arcology, all hell breaks loose. Properties are seized and wealth stolen and distributed between the victorious soldiers. - You are stripped of everything you possessed and left to rot in a corner of your once glorious arcology. - <<elseif $attackType == "freedom fighters">> - As the army of freedom fighters invades the arcology, all hell breaks loose. Their righteous fury torches everything you held dear, while the streets of the arcology run red with the blood of the masters. - You are reserved a special death: crucified in front of the arcology's entrance, your corpse a grim reminder of your legacy. - <<elseif $attackType == "free city">> - As the mercenaries break the battle lines and enter the arcology all hell breaks loose. The sectors are pillaged one by one, systematically and thoroughly. When they break in the penthouse they quickly capture and send you to their employers as proof of their success. - Your personal story may continue, but that part of it worthy of retelling has now ended. - <</if>> + <br><br> + ''GAME OVER'' + <<case "Rebellion defeat">> + <<set $ui = "start">> + <<if $slaveRebellion == 1>> + As the furious horde of slaves invades your penthouse you are left a few precious seconds to decide your fate. You embrace for the last time your faithful revolver and just as the rebels break through your doors you squeeze the trigger. + The end of your story has come and your arcology is now in the hands of whoever will take control of the vermin that dared rise up this day. + <<else>> + As the furious horde of citizens invades your penthouse you are left a few precious seconds to decide your fate. You embrace for the last time your faithful revolver and just as the rebels break through your doors you squeeze the trigger. + The end of your story has come and your arcology is now in the hands of whoever will take control of the vermin that dared rise up this day. + <</if>> - <br><br> - ''GAME OVER'' -<<elseif $gameover == "Rebellion defeat">> - <<set $ui = "start">> - <<if $slaveRebellion == 1>> - As the furious horde of slaves invades your penthouse you are left a few precious seconds to decide your fate. You embrace for the last time your faithful revolver and just as the rebels break through your doors you squeeze the trigger. - The end of your story has come and your arcology is now in the hands of whoever will take control of the vermin that dared rise up this day. - <<else>> - As the furious horde of citizens invades your penthouse you are left a few precious seconds to decide your fate. You embrace for the last time your faithful revolver and just as the rebels break through your doors you squeeze the trigger. - The end of your story has come and your arcology is now in the hands of whoever will take control of the vermin that dared rise up this day. - <</if>> + <br><br> + ''GAME OVER'' + <<case "Idiot Ball 2 The Dumbassening">> + <<case "Idiot Ball 3 Totally Not Idiot Ball 2 Again">> + <<set $ui = "start">> + As you leave your penthouse to conduct your daily rounds, you promptly get <<if $arcologyUpgrade.drones == 1>>tased by the nearest drone<<else>>tackled hard against the wall<</if>>. When you awake, it hits you like a truck; you idiotically enslaved your $PC.race ass by decreeing all <<if $gameover == "Idiot Ball 2 The Dumbassening">>non-<<print $arcologies[0].FSSupremacistRace>><<else>><<print $arcologies[0].FSSubjugationistRace>><</if>><<if $PC.race != "mixed race">>s<<else>> individuals<</if>> slaves, and since you are now a slave, lack the authority to revert the policy. The story of your remaining years may be worth telling, as is your legendary blunder, but it must be told elsewhere. - <br><br> - ''GAME OVER'' + <br><br> + ''GAME OVER'' + <<default>> + <<set $ui = "start">> + Since you are without slaves, Free Cities society no longer considers you a citizen of the first rank. Your personal story may continue, but that part of it worthy of retelling has now ended. -<<elseif $gameover == "Idiot Ball 2 The Dumbassening" || $gameover == "Idiot Ball 3 Totally Not Idiot Ball 2 Again">> - <<set $ui = "start">> - As you leave your penthouse to conduct your daily rounds, you promptly get <<if $arcologyUpgrade.drones == 1>>tased by the nearest drone<<else>>tackled hard against the wall<</if>>. When you awake, it hits you like a truck; you idiotically enslaved your $PC.race ass by decreeing all <<if $gameover == "Idiot Ball 2 The Dumbassening">>non-<<print $arcologies[0].FSSupremacistRace>><<else>><<print $arcologies[0].FSSubjugationistRace>><</if>><<if $PC.race != "mixed race">>s<<else>> individuals<</if>> slaves, and since you are now a slave, lack the authority to revert the policy. The story of your remaining years may be worth telling, as is your legendary blunder, but it must be told elsewhere. - - <br><br> - ''GAME OVER'' - -<<else>> - <<set $ui = "start">> - Since you are without slaves, Free Cities society no longer considers you a citizen of the first rank. Your personal story may continue, but that part of it worthy of retelling has now ended. - - <br><br> - ''GAME OVER'' -<</if>> \ No newline at end of file + <br><br> + ''GAME OVER'' +<</switch>> \ No newline at end of file diff --git a/src/facilities/arcade/arcadeFramework.js b/src/facilities/arcade/arcadeFramework.js index dd44a51309f009ca185f30e564f1540e224dbdc9..97e9412caf367641a4b446fbdf23924bc3c5c6c1 100644 --- a/src/facilities/arcade/arcadeFramework.js +++ b/src/facilities/arcade/arcadeFramework.js @@ -1,49 +1,36 @@ App.Data.Facilities.arcade = { baseName: "arcade", genericName: null, - assignee: { - position: "whore", - assignment: "be confined in the arcade", - }, - penthouse: { - position: "Gloryhole", - assignment: "work a glory hole", + jobs: { + assignee: { + position: "whore", + assignment: "be confined in the arcade", + publicSexUse: true, + fuckdollAccepted: true + }, }, + defaultJob: "assignee", manager: null } -App.Entity.Facilities.Arcade = class extends App.Entity.Facilities.SexWorkFacility { - constructor() { - super(App.Data.Facilities.arcade, true, true); - } - +App.Entity.Facilities.ArcadeJob = class extends App.Entity.Facilities.FacilitySingleJob { /** + * Can slave be employed at this position * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); - + canEmploy(slave) { + let r = super.canEmploy(slave); if (slave.indentureRestrictions > 0) { - r.push(`${slave.slaveName}'s indenture forbids arcade service`) + r.push(`${slave.slaveName}'s indenture forbids arcade service.`) } - - return r; - } - - /** - * @param {App.Entity.SlaveState} slave - * @returns {string[]} - */ - slaveCanWorkFromPenthouse(slave) { - let r = super.slaveCanWorkFromPenthouse(slave); - - if (slave.indentureRestrictions > 0) { - r.push(`${slave.slaveName}'s indenture forbids gloryhole service`) - } - return r; } } -App.Entity.facilities.arcade = new App.Entity.Facilities.Arcade(); +App.Entity.facilities.arcade = new App.Entity.Facilities.Facility( + App.Data.Facilities.arcade, + { + assignee: new App.Entity.Facilities.ArcadeJob() + } +); diff --git a/src/facilities/armory/armoryFramework.js b/src/facilities/armory/armoryFramework.js new file mode 100644 index 0000000000000000000000000000000000000000..01d50b48357cecc4786a0e2019714f009c4e5da6 --- /dev/null +++ b/src/facilities/armory/armoryFramework.js @@ -0,0 +1,25 @@ +App.Data.Facilities.armory = { + baseName: "dojo", + genericName: "armory", + jobs: { }, + defaultJob: null, + manager: { + position: "bodyguard", + assignment: "guard you", + careers: ["a bodyguard", "a boxer", "a bully hunter", "a child soldier", "a hitman", "a kunoichi", "a law enforcement officer", "a military brat", "a prince", "a revolutionary", "a sniper", "a soldier", "a transporter", "an assassin", "an MS pilot", "captain of the kendo club", "in a militia", "spec ops"], + skill: "bodyguard", + publicSexUse: true, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: true, + shouldHear: true, + shouldTalk: false, + shouldThink: true, + requiredDevotion: 51 + } +} + +App.Entity.facilities.armory = new App.Entity.Facilities.Facility( + App.Data.Facilities.armory +); diff --git a/src/facilities/brothel/brothelFramework.js b/src/facilities/brothel/brothelFramework.js index 296ef47f458a34eee12a4fb7b67e1892c5c442dd..a816578a5f17e0895b81fdad4dbf596a87822ef7 100644 --- a/src/facilities/brothel/brothelFramework.js +++ b/src/facilities/brothel/brothelFramework.js @@ -1,42 +1,66 @@ App.Data.Facilities.brothel = { baseName: "brothel", genericName: null, - assignee: { - position: "whore", - assignment: "work in the brothel", - }, - penthouse: { - position: "Whore", - assignment: "whore", + jobs: { + assignee: { + position: "whore", + assignment: "work in the brothel", + publicSexUse: true, + fuckdollAccepted: false + }, }, + defaultJob: "assignee", manager: { position: "madam", assignment: "be the Madam", careers: ["a banker", "a business owner", "a businessman", "a camp counselor", "a club manager", "a hotel manager", "a landlady", "a madam", "a manager", "a park ranger", "a pimp", "a procuress", "a stockbroker", "an innkeeper"], - skill: null + skill: null, + publicSexUse: true, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: true, + shouldHear: true, + shouldTalk: true, + shouldThink: true, + requiredDevotion: 50 } } -App.Entity.Facilities.Brothel = class extends App.Entity.Facilities.SexWorkFacility { - constructor() { - super(App.Data.Facilities.brothel, true, false); - } - +App.Entity.Facilities.BrothelJob = class extends App.Entity.Facilities.FacilitySingleJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); + canEmploy(slave) { + let r = super.canEmploy(slave); // condition is the same as for the club - // TODO: consider moving this to App.Entity.Facilities.SexWorkFacility - if (!App.Entity.Facilities.Facility._isBrokenEnough(slave, 51, -50, -20, -50, 50)) { - r.push(App.Entity.Facilities.Facility._stdBreakageMessage(slave)); + if (!App.Entity.Facilities.Job._isBrokenEnough(slave, 51, -50, -20, -50, 50)) { + r.push(App.Entity.Facilities.Job._stdBreakageMessage(slave)); } + return r; + } +} +App.Entity.Facilities.MadamJob = class extends App.Entity.Facilities.ManagingJob { + /** + * @param {App.Entity.SlaveState} slave + * @returns {string[]} + */ + canEmploy(slave) { + let r = super.canEmploy(slave); + if (slave.intelligence + slave.intelligenceImplant < -50) { + r.push(`${slave.slaveName} is not intelligent enough to be the Madam.`); + } return r; } } -App.Entity.facilities.brothel = new App.Entity.Facilities.Brothel(); +App.Entity.facilities.brothel = new App.Entity.Facilities.Facility( + App.Data.Facilities.brothel, + { + assignee: new App.Entity.Facilities.BrothelJob() + }, + new App.Entity.Facilities.MadamJob() +); diff --git a/src/facilities/cellblock/cellblockFramework.js b/src/facilities/cellblock/cellblockFramework.js index e450e28c4d72c664854511d01749b5f36e4b837d..c07c3473efeb9dae4826f6425358df59f21b8d02 100644 --- a/src/facilities/cellblock/cellblockFramework.js +++ b/src/facilities/cellblock/cellblockFramework.js @@ -1,40 +1,52 @@ App.Data.Facilities.cellblock = { baseName: "cellblock", genericName: null, - assignee: { - position: "", - assignment: "serve in the master suite", - }, - penthouse: { - position: "Confinement", - assignment: "stay confined", + jobs: { + assignee: { + position: "confinee", + assignment: "be confined in the cellblock", + publicSexUse: false, + fuckdollAccepted: false + }, }, + defaultJob: "assignee", manager: { position: "wardness", assignment: "be the Wardeness", careers: ["a bouncer", "a bounty hunter", "a bully", "a chief of police", "a gang member", "a hall monitor", "a mercenary", "a police detective", "a police officer", "a prison guard", "a prison warden", "a private detective", "a security guard", "a street thug", "an enforcer", "an orderly"], - skill: "wardeness" - } -} + skill: "wardeness", + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: true, + shouldHear: true, + shouldTalk: false, + shouldThink: false, + requiredDevotion: 51 -App.Entity.Facilities.Cellblock = class extends App.Entity.Facilities.Facility { - constructor() { - super(App.Data.Facilities.cellblock); } +} +App.Entity.Facilities.CellblockJob = class extends App.Entity.Facilities.FacilitySingleJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); + canEmploy(slave) { + let r = super.canEmploy(slave); if ((slave.devotion > -20 || slave.trust < -20) && (slave.devotion >= -50 || slave.trust < -50)) { - r.push(`${slave.slaveName} is sufficiently broken in so that the cellblock would have no effect`); + r.push(`${slave.slaveName} is not defiant enough for ${this.facility.name} to have an effect.`); } return r; } } -App.Entity.facilities.cellblock = new App.Entity.Facilities.Cellblock(); +App.Entity.facilities.cellblock = new App.Entity.Facilities.Facility( + App.Data.Facilities.cellblock, + { + assignee: new App.Entity.Facilities.CellblockJob() + } +); diff --git a/src/facilities/clinic/clinicFramework.js b/src/facilities/clinic/clinicFramework.js index 5b16937d91460ba6f43d98527205e28008231d9e..d2192203b0e8b87cfd2398499d619d2466af491a 100644 --- a/src/facilities/clinic/clinicFramework.js +++ b/src/facilities/clinic/clinicFramework.js @@ -1,41 +1,55 @@ App.Data.Facilities.clinic = { baseName: "clinic", genericName: null, - assignee: { - position: "patient", - assignment: "get treatment in the clinic", + jobs: { + patient: { + position: "patient", + assignment: "get treatment in the clinic", + publicSexUse: false, + fuckdollAccepted: false + } }, - penthouse: null, + defaultJob: "patient", manager: { position: "nurse", assignment: "be the Nurse", careers: ["a chemist", "a chiropractor", "a coroner", "a dentist", "a doctor", "a hospital volunteer", "a medic", "a medical student", "a midwife", "a mortician", "a nurse", "a paramedic", "a pharmacist", "a physician", "a school nurse's assistant", "a school nurse", "a surgeon"], - skill: "nurse" + skill: "nurse", + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: true, + shouldHear: true, + shouldTalk: false, + shouldThink: true, + requiredDevotion: 51 } } -App.Entity.Facilities.Clinic = class extends App.Entity.Facilities.Facility { - constructor() { - super(App.Data.Facilities.clinic); - } - +App.Entity.Facilities.ClinicPatientJob = class extends App.Entity.Facilities.FacilitySingleJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); + canEmploy(slave) { + let r = super.canEmploy(slave); const V = State.variables; if ((slave.health >= 20) && - (V.Nurse === 0 || ((slave.chem <= 15 || this.upgrade("Filters") !== 1) && + (V.Nurse === 0 || ((slave.chem <= 15 || this.facility.upgrade("Filters") !== 1) && (V.bellyImplants !== 1 || slave.bellyImplant <= -1) && - (slave.pregKnown !== 1 || (this.option("SpeedGestation") <= 0 && slave.pregControl !== "speed up")) && (slave.pregAdaptation * 1000 >= slave.bellyPreg && slave.preg <= slave.pregData.normalBirth / 1.33)))) { - r.push(`${slave.slaveName} cannot benefit from the clinic`); + (slave.pregKnown !== 1 || (this.facility.option("SpeedGestation") <= 0 && slave.pregControl !== "speed up")) && (slave.pregAdaptation * 1000 >= slave.bellyPreg && slave.preg <= slave.pregData.normalBirth / 1.33)))) { + r.push(`${slave.slaveName} cannot benefit from ${this.facility.name}.`); } return r; } } -App.Entity.facilities.clinic = new App.Entity.Facilities.Clinic(); +App.Entity.facilities.clinic = new App.Entity.Facilities.Facility( + App.Data.Facilities.clinic, + { + patient: new App.Entity.Facilities.ClinicPatientJob() + } +); diff --git a/src/facilities/club/clubFramework.js b/src/facilities/club/clubFramework.js index 481dcc5d79281ddb4f138d1949690c14e105736b..131d99d7e2cdcd1ce51f4d7410cd1741918ed161 100644 --- a/src/facilities/club/clubFramework.js +++ b/src/facilities/club/clubFramework.js @@ -1,42 +1,64 @@ App.Data.Facilities.club = { baseName: "club", genericName: null, - assignee: { - position: "", - assignment: "serve in the club", - }, - penthouse: { - position: "Public Servant ", - assignment: "serve the public", + jobs: { + slut: { + position: "Slut", + assignment: "serve in the club", + publicSexUse: true, + fuckdollAccepted: false + }, }, + defaultJob: "slut", manager: { position: "DJ", assignment: "be the DJ", careers: ["a classical dancer", "a classical musician", "a dancer", "a house DJ", "a marching band leader", "a musician", "a radio show host", "an aspiring pop star", "an idol", "an orchestra conductor"], - skill: "DJ" + skill: "DJ", + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: false, + shouldHear: true, + shouldTalk: true, + shouldThink: true, + requiredDevotion: 51 } } -App.Entity.Facilities.Club = class extends App.Entity.Facilities.SexWorkFacility { - constructor() { - super(App.Data.Facilities.club, true, false); - } - +App.Entity.Facilities.ClubSlutJob = class extends App.Entity.Facilities.FacilitySingleJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); + canEmploy(slave) { + let r = super.canEmploy(slave); // condition is the same as for the brothel - // TODO: consider moving this to App.Entity.Facilities.SexWorkFacility - if (!App.Entity.Facilities.Facility._isBrokenEnough(slave, 51, -50, -20, -50, 50)) { - r.push(App.Entity.Facilities.Facility._stdBreakageMessage(slave)); + // TODO: consider moving this to App.Entity.Facilities.SexJob + if (!App.Entity.Facilities.Job._isBrokenEnough(slave, 51, -50, -20, -50, 50)) { + r.push(App.Entity.Facilities.Job._stdBreakageMessage(slave)); } return r; } } -App.Entity.facilities.club = new App.Entity.Facilities.Club(); +App.Entity.Facilities.ClubDJJob = class extends App.Entity.Facilities.ManagingJob { + canEmploy(slave) { + let r = super.canEmploy(slave); + if (slave.intelligence + slave.intelligenceImplant < -50) { + r.push(`${slave.slaveName} is not intelligent enough to DJ.`); + } + return r; + } +} + +App.Entity.facilities.club = new App.Entity.Facilities.Facility( + App.Data.Facilities.club, + { + slut: new App.Entity.Facilities.ClubSlutJob() + }, + new App.Entity.Facilities.ClubDJJob() +); diff --git a/src/facilities/dairy/dairyFramework.js b/src/facilities/dairy/dairyFramework.js index dfb092a78774f62c95120a18e8517f471850fd20..9f960df229e9786e8a883c177c354c392d75817e 100644 --- a/src/facilities/dairy/dairyFramework.js +++ b/src/facilities/dairy/dairyFramework.js @@ -1,39 +1,40 @@ App.Data.Facilities.dairy = { baseName: "dairy", genericName: null, - assignee: { - position: "cow", - assignment: "work in the dairy", - }, - penthouse: { - position: "Milked", - assignment: "get milked", + jobs: { + cow: { + position: "cow", + assignment: "work in the dairy", + publicSexUse: false, + fuckdollAccepted: false + } }, + defaultJob: "cow", manager: { position: "milkmaid", assignment: "be the Milkmaid", careers: ["a cowgirl", "a dairy worker", "a farmer's daughter", "a milkmaid", "a shepherd", "a veterinarian"], - skill: "milkmaid" + skill: "milkmaid", + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: true, + shouldHear: true, + shouldTalk: false, + shouldThink: true, + requiredDevotion: 21 } } -App.Entity.Facilities.Dairy = class extends App.Entity.Facilities.Facility { - constructor() { - super(App.Data.Facilities.dairy); - } - - get hasFreeSpace() { - const V = State.variables; - const _dairySeed = V.bioreactorsXY + V.bioreactorsXX + V.bioreactorsHerm + V.bioreactorsBarren; - return this.capacity > this.hostedSlaves + _dairySeed; - } - +App.Entity.Facilities.DairyCowJob = class extends App.Entity.Facilities.FacilitySingleJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); + canEmploy(slave) { + let r = super.canEmploy(slave); + const V = State.variables; if ((slave.indentureRestrictions > 0) && (V.dairyRestraintsSetting > 1)) { @@ -43,43 +44,45 @@ App.Entity.Facilities.Dairy = class extends App.Entity.Facilities.Facility { r.push(`${slave.slaveName}'s indenture allows only free range milking.`); } if (slave.breedingMark === 1 && V.propOutcome === 1 && V.dairyRestraintsSetting > 0) { - r.push(`${slave.slaveName} may only be a free range cow`); + r.push(`${slave.slaveName} may only be a free range cow.`); } if ((V.dairyPregSetting > 0) && ((slave.bellyImplant !== -1) || (slave.broodmother !== 0))) { - r.push(`${slave.slaveName}'s womb cannot accommodate current machine settings`); + r.push(`${slave.slaveName}'s womb cannot accommodate current machine settings.`); } - if ((slave.amp !== 1) && (this.option("RestraintsUpgrade") !== 1) && - !App.Entity.Facilities.Facility._isBrokenEnough(slave, 20, -50, -20, -50)) { - r.push(`${slave.slaveName} must be obedient in order to be milked at ${this.name}`); + if ((slave.amp !== 1) && (this.facility.option("RestraintsUpgrade") !== 1) && + !App.Entity.Facilities.Job._isBrokenEnough(slave, 20, -50, -20, -50)) { + r.push(`${slave.slaveName} must be obedient in order to be milked at ${this.facility.name}.`); } if ((slave.lactation === 0) && (slave.balls === 0) && ((V.dairySlimMaintainUpgrade !== 1 && V.dairySlimMaintain <= 0) || (slave.boobs <= 300 && slave.balls !== 0 && V.dairyImplantsSetting !== 1) || V.dairyImplantsSetting === 2)) { if ((V.dairySlimMaintainUpgrade === 1 && V.dairySlimMaintain === 1) || (V.dairyImplantsSetting === 2) || (slave.boobs <= 300 && slave.balls > 0 && (V.dairyImplantsSetting === 0 || V.dairyImplantsSetting === 3))) { - r.push(`${slave.slaveName} is not lactating ` + ((V.seeDicks > 0) ? 'or producing semen ' : '') + `and ${this.name}'s current settings forbid the automatic implantation of lactation inducing drugs or manual stimulation to induce it, so she cannot be a cow`); + r.push(`${slave.slaveName} is not lactating ` + ((V.seeDicks > 0) ? 'or producing semen ' : '') + `and ${this.facility.name}'s current settings forbid the automatic implantation of lactation inducing drugs or manual stimulation to induce it, and thus cannot be a cow.`); } else { - r.push(`${slave.slaveName} is not lactating ` + ((V.seeDicks > 0) ? 'or producing semen ' : '') + 'and cannot be a cow'); + r.push(`${slave.slaveName} is not lactating ` + ((V.seeDicks > 0) ? 'or producing semen ' : '') + 'and cannot be a cow.'); } } else if ((V.dairyStimulatorsSetting >= 2) && (slave.anus <= 2) && (V.dairyPrepUpgrade !== 1)) { - r.push(`${slave.slaveName}'s anus cannot accommodate current machine settings`); + r.push(`${slave.slaveName}'s anus cannot accommodate current machine settings.`); } else if ((V.dairyPregSetting >= 2) && (slave.vagina <= 2) && (slave.ovaries !== 0) && (V.dairyPrepUpgrade !== 1)) { - r.push(`${slave.slaveName}'s vagina cannot accommodate current machine settings`); + r.push(`${slave.slaveName}'s vagina cannot accommodate current machine settings.`); } return r; } +} - /** - * @param {App.Entity.SlaveState} slave - * @returns {string[]} - */ - slaveCanWorkFromPenthouse(slave) { - let r = super.slaveCanWorkFromPenthouse(slave); +App.Entity.Facilities.Dairy = class extends App.Entity.Facilities.Facility { + constructor() { + super(App.Data.Facilities.dairy, + { + cow: new App.Entity.Facilities.DairyCowJob() + }); + } - if ((slave.lactation <= 0) && (slave.balls <= 0)) { - r.push(`${slave.slaveName} is not lactating` + ((State.variables.seeDicks > 0) ? ' or producing semen' : '')); - } - return r; + get hasFreeSpace() { + const V = State.variables; + const dairySeed = V.bioreactorsXY + V.bioreactorsXX + V.bioreactorsHerm + V.bioreactorsBarren; + return this.capacity > this.hostedSlaves + dairySeed; } } diff --git a/src/facilities/farmyard/farmyardFramework.js b/src/facilities/farmyard/farmyardFramework.js index 24f71a6edbacb504915a90172a2a15179fd565a4..79ba34d55359e25ea8bc7ac881b132b47e19b762 100644 --- a/src/facilities/farmyard/farmyardFramework.js +++ b/src/facilities/farmyard/farmyardFramework.js @@ -1,23 +1,32 @@ App.Data.Facilities.farmyard = { baseName: "farmyard", genericName: null, - assignee: { - position: "", - assignment: "work as a farmhand", + jobs: { + farmhand: { + position: "farmhand", + assignment: "work as a farmhand", + publicSexUse: false, + fuckdollAccepted: false + } }, - penthouse: null, + defaultJob: "farmhand", manager: { position: "farmer", assignment: "be the Farmer", careers: ["a beekeeper", "a bullfighter", "a farmer", "a farmhand", "a rancher", "a rodeo star", "a zookeeper"], - skill: "farmer" + skill: "farmer", + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: true, + shouldHear: true, + shouldTalk: false, + shouldThink: true, + requiredDevotion: 51 } } -App.Entity.Facilities.Farmyard = class extends App.Entity.Facilities.Facility { - constructor() { - super(App.Data.Facilities.farmyard); - } -} - -App.Entity.facilities.farmyard = new App.Entity.Facilities.Farmyard(); +App.Entity.facilities.farmyard = new App.Entity.Facilities.Facility( + App.Data.Facilities.farmyard +); diff --git a/src/facilities/headGirlSuite/headGirlSuiteFramework.js b/src/facilities/headGirlSuite/headGirlSuiteFramework.js new file mode 100644 index 0000000000000000000000000000000000000000..a40d3cf0a8452f9fe2facf3315d01f44cd2c3108 --- /dev/null +++ b/src/facilities/headGirlSuite/headGirlSuiteFramework.js @@ -0,0 +1,32 @@ +App.Data.Facilities.headGirlSuite = { + baseName: "HGSuite", + genericName: null, + jobs: { + HGToy: { + position: "Head Girl's toy", + assignment: "live with your Head Girl", + publicSexUse: true, + fuckdollAccepted: false + } + }, + defaultJob: "HGToy", + manager: { + position: "Head Girl", + assignment: "be your Head Girl", + careers: ["a captain", "a corporate executive", "a director", "a dominatrix", "a gang leader", "a judge", "a lawyer", "a leading arcology citizen", "a military officer", "a model-UN star", "a noblewoman", "a politician", "a Queen", "a slaver", "a student council president"], + skill: "headGirl", + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: true, + shouldHear: true, + shouldTalk: true, + shouldThink: true, + requiredDevotion: 51 + } +} + +App.Entity.facilities.headGirlSuite = new App.Entity.Facilities.Facility( + App.Data.Facilities.headGirlSuite +); diff --git a/src/facilities/masterSuite/masterSuiteFramework.js b/src/facilities/masterSuite/masterSuiteFramework.js index 4ca615876207d3faffd5c4fbc7c9421c3c8291e7..ad1b86a9eeb3f339b59af9928f1c894e8430c395 100644 --- a/src/facilities/masterSuite/masterSuiteFramework.js +++ b/src/facilities/masterSuite/masterSuiteFramework.js @@ -1,39 +1,61 @@ App.Data.Facilities.masterSuite = { baseName: "masterSuite", genericName: "Master Suite", - assignee: { - position: "fucktoy", - assignment: "serve in the master suite", - }, - penthouse: { - position: "Fucktoy", - assignment: "please you", + jobs: { + fucktoy: { + position: "fucktoy", + assignment: "serve in the master suite", + publicSexUse: false, + fuckdollAccepted: false + } }, + defaultJob: "fucktoy", manager: { position: "concubine", assignment: "be your Concubine", careers: [], - skill: null + skill: null, + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: true, + shouldWalk: false, + shouldSee: false, + shouldHear: false, + shouldTalk: false, + shouldThink: false, + requiredDevotion: 51 } } -App.Entity.Facilities.MasterSuite = class extends App.Entity.Facilities.Facility { - constructor() { - super(App.Data.Facilities.masterSuite); - } - +App.Entity.Facilities.MasterSuiteFuckToyJob = class extends App.Entity.Facilities.FacilitySingleJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); - if (!App.Entity.Facilities.Facility._isBrokenEnough(slave, 20, -51, -21, -50)) { - r.push(`${slave.slaveName} is not sufficiently broken for the master suite`); + canEmploy(slave) { + let r = super.canEmploy(slave); + if (!App.Entity.Facilities.Job._isBrokenEnough(slave, 20, -51, -21, -50)) { + r.push(`${slave.slaveName} is not sufficiently broken for ${this.facility.name}.`); } return r; } } -App.Entity.facilities.masterSuite = new App.Entity.Facilities.MasterSuite(); +App.Entity.Facilities.ConcubineJob = class extends App.Entity.Facilities.ManagingJob { + canEmploy(slave) { + let r = super.canEmploy(slave); + if (slave.amp === 1) { + r.push(`${slave.slaveName} can't serve as your Concubine without limbs.`) + } + return r; + } +} + +App.Entity.facilities.masterSuite = new App.Entity.Facilities.Facility( + App.Data.Facilities.masterSuite, + { + fucktoy: new App.Entity.Facilities.MasterSuiteFuckToyJob() + }, + new App.Entity.Facilities.ConcubineJob() +); diff --git a/src/facilities/nursery/nurseryFramework.js b/src/facilities/nursery/nurseryFramework.js index 2efb72dda025a630fb2900fe9433349a7ce0bdc2..83fd33bfba52c947ba0fe3827624164cea302972 100644 --- a/src/facilities/nursery/nurseryFramework.js +++ b/src/facilities/nursery/nurseryFramework.js @@ -1,37 +1,51 @@ App.Data.Facilities.nursery = { baseName: "nursery", genericName: null, - assignee: { - position: "nanny", - assignment: "work as a nanny" + jobs: { + nanny: { + position: "nanny", + assignment: "work as a nanny", + publicSexUse: false, + fuckdollAccepted: false + } }, - penthouse: null, + defaultJob: "nanny", manager: { position: "matron", assignment: "be the Matron", careers: ["a babysitter", "a nanny", "a practitioner", "a wet nurse", "an au pair"], - skill: "matron" + skill: "matron", + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: true, + shouldHear: true, + shouldTalk: true, + shouldThink: true, + requiredDevotion: 51 } } -App.Entity.Facilities.Nursery = class extends App.Entity.Facilities.Facility { - constructor() { - super(App.Data.Facilities.nursery); - } - +App.Entity.Facilities.NurseryNannyJob = class extends App.Entity.Facilities.FacilitySingleJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); + canEmploy(slave) { + let r = super.canEmploy(slave); - if (!App.Entity.Facilities.Facility._isBrokenEnough(slave, -20, -50, 20, -21)) { - r.push(App.Entity.Facilities.Facility._stdBreakageMessage(slave)); + if (!App.Entity.Facilities.Job._isBrokenEnough(slave, -20, -50, 20, -21)) { + r.push(App.Entity.Facilities.Job._stdBreakageMessage(slave)); } return r; } } -App.Entity.facilities.nursery = new App.Entity.Facilities.Nursery(); +App.Entity.facilities.nursery = new App.Entity.Facilities.Facility( + App.Data.Facilities.nursery, + { + nanny: new App.Entity.Facilities.NurseryNannyJob() + } +); diff --git a/src/facilities/penthouse/penthouseFramework.js b/src/facilities/penthouse/penthouseFramework.js new file mode 100644 index 0000000000000000000000000000000000000000..c757b11a7e3c657c7050092461f351551deac014 --- /dev/null +++ b/src/facilities/penthouse/penthouseFramework.js @@ -0,0 +1,171 @@ + +App.Data.Facilities.penthouse = { + baseName: "", + genericName: "Penthouse", + jobs: { + rest: { + position: "Rest", + assignment: "rest", + publicSexUse: false, + fuckdollAccepted: false + }, + fucktoy: { + position: "Fucktoy", + assignment: "please you", + publicSexUse: false, + fuckdollAccepted: true + }, + classes: { + position: "Classes", + assignment: "take classes", + publicSexUse: false, + fuckdollAccepted: false + }, + houseServant: { + position: "House Servant", + assignment: "be a servant", + publicSexUse: false, + fuckdollAccepted: false + }, + whore: { + position: "Whore", + assignment: "whore", + publicSexUse: true, + fuckdollAccepted: false + }, + publicServant: { + position: "Public Servant", + assignment: "serve the public", + publicSexUse: true, + fuckdollAccepted: false + }, + subordinateSlave: { + position: "Subordinate slave", + assignment: "be a subordinate slave", + publicSexUse: false, + fuckdollAccepted: false + }, + cow: { + position: "Milked", + assignment: "get milked", + publicSexUse: false, + fuckdollAccepted: false + }, + gloryhole: { + position: "Gloryhole", + assignment: "work a glory hole", + publicSexUse: false, + fuckdollAccepted: true + }, + confinement: { + position: "Confinement", + assignment: "stay confined", + publicSexUse: false, + fuckdollAccepted: true + } + }, + defaultJob: "rest", + manager: { + position: "Recruiter", + assignment: "recruit girls", + careers: ["a club recruiter", "a college scout", "a con artist", "a cult leader", "a girl scout", "a hunter", "a lobbyist", "a military recruiter", "a missionary", "a political activist", "a princess", "a spy", "a talent scout", "retired"], + skill: "recruiter", + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: true, + shouldHear: true, + shouldTalk: true, + shouldThink: true, + requiredDevotion: 51 + } +} + +App.Entity.Facilities.PenthouseJob = class extends App.Entity.Facilities.Job { + +} + +App.Entity.Facilities.PenthouseJobs = { + Classes: class extends App.Entity.Facilities.PenthouseJob { + canEmploy(slave) { + let r = super.canEmploy(slave); + if (slave.intelligenceImplant >= 15) { + r.push(`${slave.slaveName} already has a basic education.`); + } + if (!App.Entity.Facilities.Job._isBrokenEnough(slave, -20, -50, -20, -51)) { + r.push(`${slave.slaveName} is too resistant to learn.`); + } + + if (slave.fetish === "mindbroken") { + r.push(`${capFirstChar(slave.possessive)} mind is fundamentally broken and can't learn.`); + } + return r; + } + }, + HouseServant: class extends App.Entity.Facilities.PenthouseJob { + canEmploy(slave) { + let r = super.canEmploy(slave); + + if (!App.Entity.Facilities.Job._isBrokenEnough(slave, -20, -50, -19, -51)) { + r.push(App.Entity.Facilities.Job._stdBreakageMessage(slave)); + } + + if (!canWalk(slave)) { + r.push(`${slave.slaveName} can't walk and would be unable to properly clean.`); + } + if (!canSee(slave)) { + r.push(`${slave.slaveName} is blind and would be unable to properly clean.`); + } + + return r; + } + + }, + + SubordinateSlave: class extends App.Entity.Facilities.PenthouseJob { + canEmploy(slave) { + let r = super.canEmploy(slave); + if (!App.Entity.Facilities.Job._isBrokenEnough(slave, -20, -50, -19, -51)) { + r.push(App.Entity.Facilities.Job._stdBreakageMessage(slave)); + } + return r; + } + }, + Cow: class extends App.Entity.Facilities.PenthouseJob { + canEmploy(slave) { + let r = super.canEmploy(slave); + + if ((slave.lactation <= 0) && (slave.balls <= 0)) { + r.push(`${slave.slaveName} is not lactating` + ((State.variables.seeDicks > 0) ? ' or producing semen.' : '.')); + } + return r; + } + }, +} + +App.Entity.Facilities.Penthouse = class extends App.Entity.Facilities.Facility { + constructor() { + + super(App.Data.Facilities.penthouse, { + classes: new App.Entity.Facilities.PenthouseJobs.Classes(), + houseServant: new App.Entity.Facilities.PenthouseJobs.HouseServant(), + subordinateSlave: new App.Entity.Facilities.PenthouseJobs.SubordinateSlave(), + cow: new App.Entity.Facilities.PenthouseJobs.Cow() + }); + } + + /** Facility slave capacity + * @returns {number} */ + get capacity() { + return State.variables.dormitory; + } + + /** Number of already hosted slaves + * @returns {number} */ + get hostedSlaves() { + return State.variables.dormitoryPopulation; + } +} + +App.Entity.facilities.penthouse = new App.Entity.Facilities.Penthouse(); diff --git a/src/facilities/pit/pitFramework.js b/src/facilities/pit/pitFramework.js index 9b4369c0554b95abad9b96c4bc2715631348bfd9..b77697e3862d278da448f3ba490a64d01903db33 100644 --- a/src/facilities/pit/pitFramework.js +++ b/src/facilities/pit/pitFramework.js @@ -1,36 +1,53 @@ App.Data.Facilities.pit = { baseName: "pit", genericName: null, - assignee: { - position: "fighter", - assignment: "" + jobs: { + fighter: { + position: "fighter", + assignment: "", + publicSexUse: false, + fuckdollAccepted: false + } }, - penthouse: null, + defaultJob: "fighter", manager: null } -App.Entity.Facilities.Pit = class extends App.Entity.Facilities.Facility { - constructor() { - super(App.Data.Facilities.pit); - } - +App.Entity.Facilities.PitFighterJob = class extends App.Entity.Facilities.FacilitySingleJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); + canEmploy(slave) { + let r = super.canEmploy(slave); if (slave.breedingMark === 1 && State.variables.propOutcome === 1) { r.push(`${slave.slaveName} may not participate in combat.`); } if (slave.indentureRestrictions > 1) { r.push(`${slave.slaveName}'s indenture forbids fighting.`); } - if ((slave.indentureRestrictions > 0) && (this.option("Lethal") === 1)) { + if ((slave.indentureRestrictions > 0) && (this.facility.option("Lethal") === 1)) { r.push(`${slave.slaveName}'s indenture forbids lethal fights.`); } return r; } + + isEmployed(slave) { + return State.variables.fighterIDs.includes(slave.ID); + } +} + +App.Entity.Facilities.Pit = class extends App.Entity.Facilities.Facility { + constructor() { + super(App.Data.Facilities.pit, + { + fighter: new App.Entity.Facilities.PitFighterJob() + }); + } + + get hostedSlaves() { + return 0; // does not host anyone + } } App.Entity.facilities.pit = new App.Entity.Facilities.Pit(); diff --git a/src/facilities/schoolroom/schoolroomFramework.js b/src/facilities/schoolroom/schoolroomFramework.js index 578612c218e1e3144ae2122798fbb4992f69871e..b3bd82c9fd73cc9bdb4526726015e7e7f8d3e7de 100644 --- a/src/facilities/schoolroom/schoolroomFramework.js +++ b/src/facilities/schoolroom/schoolroomFramework.js @@ -1,66 +1,58 @@ App.Data.Facilities.schoolroom = { baseName: "schoolroom", genericName: null, - assignee: { - position: "", - assignment: "learn in the schoolroom", - }, - penthouse: { - position: "Classes", - assignment: "take classes", + jobs: { + student: { + position: "", + assignment: "learn in the schoolroom", + publicSexUse: false, + fuckdollAccepted: false + } }, + defaultJob: "student", manager: { position: "teacher", assignment: "be the Schoolteacher", careers: ["a child prodigy", "a coach", "a dean", "a historian", "a librarian", "a principal", "a private instructor", "a professor", "a scholar", "a scientist", "a teacher's pet", "a teacher", "a teaching assistant", "an archaeologist", "an astronaut", "an economist"], - skill: "teacher" + skill: "teacher", + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: false, + shouldSee: true, + shouldHear: true, + shouldTalk: true, + shouldThink: true, + requiredDevotion: 51 } } -App.Entity.Facilities.Schoolroom = class extends App.Entity.Facilities.Facility { - constructor() { - super(App.Data.Facilities.schoolroom); - } - - /** - * @param {App.Entity.SlaveState} slave - * @returns {string[]} - */ - slaveCanWorkFromPenthouse(slave) { - let r = super.slaveCanWorkFromPenthouse(slave); - if (slave.intelligenceImplant >= 15) { - r.push(`${slave.slaveName} already has a basic education`); - } - if (!App.Entity.Facilities.Facility._isBrokenEnough(slave, -20, -50, -20, -51)) { - r.push(`${slave.slaveName} is too resistant to learn`); - } - - if (slave.fetish === "mindbroken") { - r.push(`${capFirstChar(slave.possessive)} mind is fundamentally broken and can't learn`); - } - return r; - } - +App.Entity.Facilities.SchoolroomStudentJob = class extends App.Entity.Facilities.FacilitySingleJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); + canEmploy(slave) { + let r = super.canEmploy(slave); - if (!App.Entity.Facilities.Facility._isBrokenEnough(slave, -20, -50, -20, -51)) { - r.push(`${slave.slaveName} is too resistant to learn`); + if (!App.Entity.Facilities.Job._isBrokenEnough(slave, -20, -50, -20, -51)) { + r.push(`${slave.slaveName} is too resistant to learn.`); } - const maxSkill = 10 + this.upgrade("Skills") * 20; // maximal skill value the scholl can teach - if ((slave.intelligenceImplant >= 30) && (slave.voice === 0 || slave.accent + this.upgrade("Language") <= 2) && + const maxSkill = 10 + this.facility.upgrade("Skills") * 20; // maximal skill value the scholl can teach + if ((slave.intelligenceImplant >= 30) && (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))) { - r.push(`${slave.slaveName} already has a basic education`); + r.push(`${slave.slaveName} has nothing left to learn.`); } return r; } } -App.Entity.facilities.schoolrom = new App.Entity.Facilities.Schoolroom(); +App.Entity.facilities.schoolroom = new App.Entity.Facilities.Facility( + App.Data.Facilities.schoolroom, + { + student: new App.Entity.Facilities.SchoolroomStudentJob() + } +); diff --git a/src/facilities/servantsQuarters/servantsQuartersFramework.js b/src/facilities/servantsQuarters/servantsQuartersFramework.js index 03a556170703c7a845d5734a5c070106125d633b..8056e30154127b509bcbb1425d1b568fb998be8d 100644 --- a/src/facilities/servantsQuarters/servantsQuartersFramework.js +++ b/src/facilities/servantsQuarters/servantsQuartersFramework.js @@ -1,66 +1,71 @@ App.Data.Facilities.servantsQuaters = { baseName: "servantsQuarters", genericName: "Servants' Quarters", - assignee: { - position: "servant", - assignment: "work as a servant", - }, - penthouse: { - position: "House Servant", - assignment: "be a servant", + jobs: { + servant: { + position: "servant", + assignment: "work as a servant", + publicSexUse: false, + fuckdollAccepted: false + } }, + defaultJob: "servant", manager: { position: "stewardess", assignment: "be the Stewardess", careers: ["a barista", "a bartender", "a brewer", "a bureaucrat", "a caregiver", "a charity worker", "a club treasurer", "a concierge", "a critic", "a housekeeper", "a housesitter", "a lemonade stand operator", "a personal assistant", "a professional bartender", "a secretary", "a wedding planner", "an air hostess", "an architect", "an editor", "an estate agent", "an investor", "an office worker"], - skill: "stewardess" + skill: "stewardess", + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: true, + shouldHear: true, + shouldTalk: true, + shouldThink: true, + requiredDevotion: 51 } } -App.Entity.Facilities.ServantsQuarters = class extends App.Entity.Facilities.Facility { - constructor() { - super(App.Data.Facilities.servantsQuaters); - } - +App.Entity.Facilities.ServantsQuartersServantJob = class extends App.Entity.Facilities.FacilitySingleJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); + canEmploy(slave) { + let r = super.canEmploy(slave); - if (!App.Entity.Facilities.Facility._isBrokenEnough(slave, -20, -50, 20, -21)) { - r.push(App.Entity.Facilities.Facility._stdBreakageMessage(slave)); + if (!App.Entity.Facilities.Job._isBrokenEnough(slave, -20, -50, 20, -21)) { + r.push(App.Entity.Facilities.Job._stdBreakageMessage(slave)); } if (!window.canWalk(slave)) { - r.push(`${slave.slaveName} can't work as a servant because ${slave.pronoun} can't walk`); + r.push(`${slave.slaveName} can't walk and would be unable to properly clean.`); } if (!canSee(slave)) { - r.push(`${slave.slaveName} can't work as a servant because ${slave.pronoun} is blind`); + r.push(`${slave.slaveName} is blind and would be unable to properly clean.`); } return r; } +} +App.Entity.Facilities.ServantsQuartersStewardessJob = class extends App.Entity.Facilities.ManagingJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - slaveCanWorkFromPenthouse(slave) { - let r = super.slaveCanWorkFromPenthouse(slave); - - if (!App.Entity.Facilities.Facility._isBrokenEnough(slave, -20, -50, -19, -51)) { - r.push(App.Entity.Facilities.Facility._stdBreakageMessage(slave)); + canEmploy(slave) { + let r = super.canEmploy(slave); + if (slave.intelligence + slave.intelligenceImplant < -50) { + r.push(`${slave.slaveName} is not intellegent enough.`); } - - if (!canWalk(slave)) { - r.push(`${slave.slaveName} can't work as a servant because ${slave.pronoun} can't walk`); - } - if (!canSee(slave)) { - r.push(`${slave.slaveName} can't work as a servant because ${slave.pronoun} is blind`); - } - return r; } } -App.Entity.facilities.servantsQuarters = new App.Entity.Facilities.ServantsQuarters(); +App.Entity.facilities.servantsQuarters = new App.Entity.Facilities.Facility( + App.Data.Facilities.servantsQuaters, + { + servant: new App.Entity.Facilities.ServantsQuartersServantJob() + }, + new App.Entity.Facilities.ServantsQuartersStewardessJob() +); diff --git a/src/facilities/spa/spaFramework.js b/src/facilities/spa/spaFramework.js index 77c04f998064812c0b014a143943461d276e9ac6..5bfe6ed053ac0cc2872e79b770e382909f65d99c 100644 --- a/src/facilities/spa/spaFramework.js +++ b/src/facilities/spa/spaFramework.js @@ -1,46 +1,51 @@ App.Data.Facilities.spa = { baseName: "spa", genericName: null, - assignee: { - position: "", - assignment: "rest in the spa" - }, - penthouse: { - position: "Rest", - assignment: "rest", + jobs: { + assignee: { + position: "", + assignment: "rest in the spa", + publicSexUse: false, + fuckdollAccepted: false, + } }, + defaultJob: "assignee", manager: { position: "attendant", assignment: "be the Attendant", careers: ["a barber", "a cosmetologist", "a counselor", "a dispatch officer", "a fortune teller", "a groomer", "a latchkey kid", "a lifeguard", "a masseuse", "a mediator", "a personal trainer", "a police negotiator", "a psychologist", "a therapist", "a yoga instructor"], - skill: "attendant" + skill: "attendant", + publicSexUse: false, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: false, + shouldHear: true, + shouldTalk: false, + shouldThink: true, + requiredDevotion: 51 } } -App.Entity.Facilities.Spa = class extends App.Entity.Facilities.Facility { - constructor() { - super(App.Data.Facilities.spa); - } - - penthouseAssignmentLink(i, passage, callback) { - const linkAction = callback !== undefined ? callback(this.desc.penthouse.assignment) : ''; - const slRef = App.Utils.slaveRefString(i); - return `<<link "Rest"${passage !== undefined ? ' "' + passage + '"' : ''}>><<= removeJob(${slRef}, ${slRef}.assignment)>>${linkAction}<</link>>`; - } - +App.Entity.Facilities.SpaAssigneeJob = class extends App.Entity.Facilities.FacilitySingleJob { /** * @param {App.Entity.SlaveState} slave * @returns {string[]} */ - canHostSlave(slave) { - let r = super.canHostSlave(slave); + canEmploy(slave) { + let r = super.canEmploy(slave); if (((slave.devotion < -20 && slave.fetish !== "mindbroken") || (slave.health >= 20 && slave.trust > 60 && slave.devotion > 60 && slave.fetish !== "mindbroken" && slave.sexualFlaw === "none" && slave.behavioralFlaw === "none"))) { - r.push(`${slave.slaveName} can not benefit from spa procedures`); + r.push(`${slave.slaveName} will not benefit from time at ${this.facility.name}.`); } return r; } } -App.Entity.facilities.spa = new App.Entity.Facilities.Spa(); +App.Entity.facilities.spa = new App.Entity.Facilities.Facility( + App.Data.Facilities.spa, + { + assignee: new App.Entity.Facilities.SpaAssigneeJob() + } +); diff --git a/src/init/setupVars.tw b/src/init/setupVars.tw index 303e439ee5dba5a8506619c4b361f3f6b691216e..97f0e27335b1d7d8ec7ba086d58747f8c2578b88 100644 --- a/src/init/setupVars.tw +++ b/src/init/setupVars.tw @@ -317,13 +317,13 @@ equine: {type: "equine", normalOvaMin:1, normalOvaMax: 1, normalBirth: 48, minLi <<set setup.whoreCareers = ["a child prostitute", "a criminal", "a cum dump", "a Futanari Sister", "a juvenile delinquent", "a mail-order bride", "a meat toilet", "a mistress", "a model", "a pageant star", "a pirate", "a porn star", "a prostitute", "a reality show star", "a saleswoman", "a serial divorcee", "a stripper", "a trophy wife", "an escort", "an exotic dancer"]>> -<<set setup.HGCareers = ["a captain", "a corporate executive", "a director", "a dominatrix", "a gang leader", "a judge", "a lawyer", "a leading arcology citizen", "a military officer", "a model-UN star", "a noblewoman", "a politician", "a Queen", "a slaver", "a student council president"]>> +<<set setup.HGCareers = App.Data.Facilities.headGirlSuite.manager.careers>> <<set setup.madamCareers = App.Data.Facilities.brothel.manager.careers>> <<set setup.DJCareers = App.Data.Facilities.club.manager.careers>> -<<set setup.bodyguardCareers = ["a bodyguard", "a boxer", "a bully hunter", "a child soldier", "a hitman", "a kunoichi", "a law enforcement officer", "a military brat", "a prince", "a revolutionary", "a sniper", "a soldier", "a transporter", "an assassin", "an MS pilot", "captain of the kendo club", "in a militia", "spec ops"]>> +<<set setup.bodyguardCareers = App.Data.Facilities.armory.manager.careers>> <<set setup.wardenessCareers = App.Data.Facilities.cellblock.manager.careers>> @@ -341,7 +341,7 @@ equine: {type: "equine", normalOvaMin:1, normalOvaMax: 1, normalBirth: 48, minLi <<set setup.schoolteacherCareers = App.Data.Facilities.schoolroom.manager.careers>> -<<set setup.recruiterCareers = ["a club recruiter", "a college scout", "a con artist", "a cult leader", "a girl scout", "a hunter", "a lobbyist", "a military recruiter", "a missionary", "a political activist", "a princess", "a spy", "a talent scout", "retired"]>> /* pregmod */ +<<set setup.recruiterCareers = App.Data.Facilities.penthouse.manager.careers>> /* pregmod */ <<set setup.servantCareers = ["a butler", "a cook", "a handmaiden", "a housewife", "a maid", "a shrine maiden"]>> diff --git a/src/js/assignJS.js b/src/js/assignJS.js index 17d69c8b0e51c86529454a62f4fe46fba723a38e..f3e7b9462b266e9f0ad7572f45ae0d052acc01ed 100644 --- a/src/js/assignJS.js +++ b/src/js/assignJS.js @@ -551,18 +551,20 @@ window.resetJobIDArray = function resetJobIDArray() { /* todo: expand to all ass App.UI.jobLinks = function () { "use strict"; const facilitiesOrder = [ - App.Entity.facilities.spa, - App.Entity.facilities.clinic, - App.Entity.facilities.masterSuite, - App.Entity.facilities.schoolrom, - App.Entity.facilities.servantsQuarters, - App.Entity.facilities.farmyard, + /* sorted by improvement before work, within improvement in order of progress, within work alphabetical for facilities*/ + App.Entity.facilities.penthouse, + App.Entity.facilities.cellblock, App.Entity.facilities.nursery, + App.Entity.facilities.schoolroom, + App.Entity.facilities.clinic, + App.Entity.facilities.spa, + App.Entity.facilities.arcade, App.Entity.facilities.brothel, App.Entity.facilities.club, App.Entity.facilities.dairy, - App.Entity.facilities.arcade, - App.Entity.facilities.cellblock + App.Entity.facilities.farmyard, + App.Entity.facilities.masterSuite, + App.Entity.facilities.servantsQuarters ]; return { @@ -578,50 +580,32 @@ App.UI.jobLinks = function () { * @returns {string} */ function assignmentLinks(index, passage, callback) { - let res = []; - /** @type {App.Entity.SlaveState} */ - const slave = index >= 0 ? State.variables.slaves[index] : State.variables.activeSlave; + let penthouseJobs = App.Entity.facilities.penthouse.assignmentLinks(index, undefined, passage, callback); + const slave = App.Utils.slaveByIndex(index); - for (const f of facilitiesOrder) { - if (!f.penthouseAssignmentAvailable) continue; - const rejects = f.slaveCanWorkFromPenthouse(slave); - if (rejects.length === 0) { - res.push(f.penthouseAssignmentLink(index, passage, callback)); - } else { - res.push(App.UI.disabledLink(f.penthouseJob, rejects)); - } - } if (slave.fuckdoll === 0) { const assignment = "choose her own job"; if (slave.assignment !== assignment) { const linkAction = callback !== undefined ? callback(assignment) : ''; - res.push(`<<link "Let ${slave.object} choose" ${passage !== undefined ? '"' + passage + '"' : ''}>><<= assignJob(${App.Utils.slaveRefString(index)}, "${assignment}")>>${linkAction}<</link>>`); + penthouseJobs.push(`<<link "Let ${slave.object} choose" ${passage !== undefined ? '"' + passage + '"' : ''}>><<= assignJob(${App.Utils.slaveRefString(index)}, "${assignment}")>>${linkAction}<</link>>`); } } else { - res.push(App.UI.disabledLink(`Let ${slave.object} choose`, ["Fuckdolls can't choose their job"])); + penthouseJobs.push(App.UI.disabledLink(`Let ${slave.object} choose`, ["Fuckdolls can't choose their job"])); } - return res.join(" | "); + return penthouseJobs.join(" | "); } function transferLinks(index) { /** @type {string[]} */ const transfers = []; - /** @type {App.Entity.SlaveState} */ - const slave = index >= 0 ? State.variables.slaves[index] : State.variables.activeSlave; - - if (slave.assignment !== "rest" && slave.assignment !== "please you" && slave.assignment !== "take classes" && slave.assignment !== "be a servant" && slave.assignment !== "whore" && slave.assignment !== "work a glory hole" && slave.assignment !== "serve the public" && slave.assignment !== "get milked" && slave.assignment !== "stay confined") { - transfers.push(`<<link "Penthouse" "Main">><<= removeJob($slaves[${index}], $slaves[${index}].assignment)>><</link>>`); - } else { - transfers.push(App.UI.disabledLink('Penthouse', [`${slave.slaveName} is already at the Penthouse`])); - } + const slave = App.Utils.slaveByIndex(index); for (const f of facilitiesOrder) { if (!f.established) continue; - const rejects = f.canHostSlave(slave); if (rejects.length === 0) { - transfers.push(f.transferLink(index)); + transfers.push(f.transferLink(index, undefined, passage())); } else { transfers.push(App.UI.disabledLink(f.genericName, rejects)); } diff --git a/src/js/descriptionWidgets.js b/src/js/descriptionWidgets.js index 91ba8540fcd90237e4d2dd5898bfbe697af6c408..350876cb0288e52902abac342be681c05b481686 100644 --- a/src/js/descriptionWidgets.js +++ b/src/js/descriptionWidgets.js @@ -980,9 +980,9 @@ App.Desc.waist = } else { r += `an <span class=pink>absurdly narrow waist</span> that gives ${him} a cartoonishly hourglass figure`; if (slave.weight > 30) { - r += `made even more ludicrous by ${his} extra weight. `; + r += ` made even more ludicrous by ${his} extra weight. `; } else if (slave.weight < -30) { - r += `made even more ludicrous by how thin ${he} is. `; + r += ` made even more ludicrous by how thin ${he} is. `; } else { r += `. `; } diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js index 7caebe85b2e0c19b7cffb3a976f974de4fa9414c..b7b14df26beee0491ee5bbee6dc61573bec1df6f 100644 --- a/src/js/slaveSummaryWidgets.js +++ b/src/js/slaveSummaryWidgets.js @@ -726,15 +726,15 @@ window.SlaveSummaryUncached = (function () { } r += `</span> `; if (slave.dietCum === 2) { - r += `Diet Base: <span class="cyan">Cum Based.</span>`; + r += `Diet base: <span class="cyan">Cum Based.</span>`; } else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) { - r += `Diet Base: <span class="cyan">Cum Added.</span>`; + r += `Diet base: <span class="cyan">Cum Added.</span>`; } else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) { - r += `Diet Base: <span class="cyan">Milk & Cum Added.</span>`; + r += `Diet base: <span class="cyan">Milk & Cum Added.</span>`; } else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) { - r += `Diet Base: <span class="cyan">Milk Added.</span>`; + r += `Diet base: <span class="cyan">Milk Added.</span>`; } else if ((slave.dietMilk === 2)) { - r += `Diet Base: <span class="cyan">Milk Based.</span>`; + r += `Diet base: <span class="cyan">Milk Based.</span>`; } r += " "; } @@ -5068,61 +5068,53 @@ App.UI.slaveSummaryList = function (passageName) { "Club": App.Entity.facilities.club, "Dairy": App.Entity.facilities.dairy, "Farmyard": App.Entity.facilities.farmyard, + "Head Girl Suite": App.Entity.facilities.headGirlSuite, "Master Suite": App.Entity.facilities.masterSuite, "Nursery": App.Entity.facilities.nursery, "Pit": App.Entity.facilities.pit, - "Schoolroom": App.Entity.facilities.schoolrom, + "Schoolroom": App.Entity.facilities.schoolroom, "Servants' Quarters": App.Entity.facilities.servantsQuarters, "Spa": App.Entity.facilities.spa }; - const managerSelectPassageToFacilityMap = { - "Attendant Select": App.Entity.facilities.spa, - "Matron Select": App.Entity.facilities.nursery, - "Madam Select": App.Entity.facilities.brothel, - "Milkmaid Select": App.Entity.facilities.dairy, - "Nurse Select": App.Entity.facilities.clinic, - "DJ Select": App.Entity.facilities.club, - "Farmer Select": App.Entity.facilities.farmyard, - "Stewardess Select": App.Entity.facilities.servantsQuarters, - "Schoolteacher Select": App.Entity.facilities.schoolrom, - "Wardeness Select": App.Entity.facilities.cellblock, - }; + function makeSelectionPassageInfo(f, wp) { + return { + facility: f, + passage: wp + }; + } - // TODO: merge with managerSelectPassageToFacilityMap - const selectionWorkarounds = { - "Agent Select": "Agent Workaround", - "BG Select": "Bodyguard Workaround", - "Recruiter Select": "Recruiter Workaround", - "HG Select": "HG Workaround", - "Attendant Select":"Attendant Workaround", - "Matron Select": "Matron Workaround", - "Madam Select": "Madam Workaround", - "DJ Select": "DJ Workaround", - "Nurse Select": "Nurse Workaround", - "Schoolteacher Select": "Schoolteacher Workaround", - "Milkmaid Select": "Milkmaid Workaround", - "Farmer Select": "Farmer Workaround", - "Stewardess Select": "Stewardess Workaround", - "Concubine Select": "Concubine Workaround", - "Wardeness Select": "Wardeness Workaround" + const selectionPassageToFacilityMap = { + "HG Select": makeSelectionPassageInfo(App.Entity.facilities.headGirlSuite, "HG Workaround"), + "BG Select": makeSelectionPassageInfo(App.Entity.facilities.armory, "Bodyguard Workaround"), + "Attendant Select": makeSelectionPassageInfo(App.Entity.facilities.spa, "Attendant Workaround"), + "Concubine Select": makeSelectionPassageInfo(App.Entity.facilities.masterSuite, "Concubine Workaround"), + "Matron Select": makeSelectionPassageInfo(App.Entity.facilities.nursery, "Matron Workaround"), + "Madam Select": makeSelectionPassageInfo(App.Entity.facilities.brothel, "Madam Workaround"), + "Milkmaid Select": makeSelectionPassageInfo(App.Entity.facilities.dairy, "Milkmaid Workaround"), + "Nurse Select": makeSelectionPassageInfo(App.Entity.facilities.clinic, "Nurse Workaround"), + "DJ Select": makeSelectionPassageInfo(App.Entity.facilities.club, "DJ Workaround"), + "Farmer Select": makeSelectionPassageInfo(App.Entity.facilities.farmyard, "Farmer Workaround"), + "Stewardess Select": makeSelectionPassageInfo(App.Entity.facilities.servantsQuarters, "Stewardess Workaround"), + "Schoolteacher Select": makeSelectionPassageInfo(App.Entity.facilities.schoolroom, "Schoolteacher Workaround"), + "Wardeness Select": makeSelectionPassageInfo(App.Entity.facilities.cellblock, "Wardeness Workaround"), + "Agent Select": makeSelectionPassageInfo(App.Entity.facilities.arcologyAgent, "Agent Workaround"), + "Recruiter Select": makeSelectionPassageInfo(App.Entity.facilities.penthouse, "Recruiter Workaround") }; /** @type {App.Entity.Facilities.Facility} */ const passageFacility = passageToFacilityMap[passageName]; - /** @type {App.Entity.Facilities.Facility} */ - const managerSelectFacility = managerSelectPassageToFacilityMap[passageName]; - /** @type {string} */ - const selectionWorkaround = selectionWorkarounds[passageName]; + /** @type {{facility: App.Entity.Facilities.Facility, passage: string}} */ + const slaveSelect = passageFacility === undefined ? selectionPassageToFacilityMap[passageName] : undefined; for (const _ssi of _filteredSlaveIdxs) { let _Slave = slaves[_ssi]; if (passageName === "Main" && V.useSlaveSummaryTabs === 1) { if (tabName === "overview") { - if (V.showOneSlave === "Head Girl" && _Slave.assignment !== "be your Head Girl") continue; - if (V.showOneSlave === "recruit girls" && _Slave.assignment !== "recruit girls") continue; - if (V.showOneSlave === "guard you" && _Slave.assignment !== "guard you") continue; + if (V.showOneSlave === "Head Girl" && _Slave.assignment !== App.Data.Facilities.headGirlSuite.manager.assignment) continue; + if (V.showOneSlave === "recruit girls" && _Slave.assignment !== App.Entity.facilities.penthouse.manager.assignment) continue; + if (V.showOneSlave === "guard you" && _Slave.assignment !== App.Data.Facilities.armory.manager.assignment) continue; } else { if (tabName === "resting") { if (_Slave.assignment !== "rest") continue; @@ -5147,8 +5139,10 @@ App.UI.slaveSummaryList = function (passageName) { } const rejects = passageFacility.canHostSlave(_Slave); if (rejects.length > 0) { - let rejectString = `${_slaveName}: <ul>${rejects.map(e => `<li>${e}</li>`).join('')}</ul></div>`; - res.push(rejectString); + let rejectString = rejects.length === 1 ? + rejects[0]: + `${_slaveName}: <ul>${rejects.map(e => `<li>${e}</li>`).join('')}</ul>`; + res.push(rejectString + '</div>'); continue; } else { res.push(dividerAndImage(_Slave)); @@ -5161,9 +5155,9 @@ App.UI.slaveSummaryList = function (passageName) { if ((V.seeImages === 1) && (V.seeSummaryImages === 1)) res.push(slaveImage(_Slave)); res.push(`[[${_slaveName}|Slave Interact][$activeSlave = $slaves[${_ssi}]]]`); } - } else if (selectionWorkaround !== undefined) { + } else if (slaveSelect !== undefined && slaveSelect.passage !== "") { res.push(dividerAndImage(_Slave)); - res.push(`[[${_slaveName}|${selectionWorkaround}][$i = ${_ssi}]]`); + res.push(`[[${_slaveName}|${slaveSelect.passage}][$i = ${_ssi}]]`); } switch (passageName) { case "Main": @@ -5174,9 +5168,9 @@ App.UI.slaveSummaryList = function (passageName) { _Slave = slaves[_ssi]; /* restore devotion value so repeatedly changing clothes isn't an exploit */ } res.push(dividerAndImage(_Slave)); - if ("be your Head Girl" === _Slave.assignment) res.push('<strong>@@.lightcoral;HG@@</strong> '); - else if ("recruit girls" === _Slave.assignment) res.push('<strong>@@.lightcoral;RC@@</strong> '); - else if ("guard you" === _Slave.assignment) res.push('<strong>@@.lightcoral;BG@@</strong> '); + if (App.Data.Facilities.headGirlSuite.manager.assignment === _Slave.assignment) res.push('<strong>@@.lightcoral;HG@@</strong> '); + else if (App.Data.Facilities.penthouse.manager.assignment === _Slave.assignment) res.push('<strong>@@.lightcoral;RC@@</strong> '); + else if (App.Data.Facilities.armory.manager.assignment === _Slave.assignment) res.push('<strong>@@.lightcoral;BG@@</strong> '); if (Array.isArray(V.personalAttention) && V.personalAttention.findIndex(s => s.ID === _Slave.ID) !== -1) { res.push('<strong>@@.lightcoral; PA@@</strong> '); @@ -5188,15 +5182,6 @@ App.UI.slaveSummaryList = function (passageName) { res.push(dividerAndImage(_Slave)); res.push(`<<link "${_slaveName}">> <<run App.UI.selectSlaveForPersonalAttention(${_Slave.ID})>><</link>>`); break; - case "Head Girl Suite": - if (V.Flag === 0) { - res.push(dividerAndImage(_Slave)); - res.push(`[[${_slaveName}|Slave Interact][$activeSlave = $slaves[${_ssi}]]]`); - } else { - res.push(dividerAndImage(_Slave)); - res.push(`[[${_slaveName}|Slave Interact][$activeSlave = $slaves[${_ssi}]]]`); - } - break; case "Subordinate Targeting": res.push(dividerAndImage(_Slave)); res.push(`[[${_slaveName}|Subordinate Targeting][$activeSlave.subTarget = $slaves[${_ssi}].ID]]`); @@ -5298,8 +5283,18 @@ App.UI.slaveSummaryList = function (passageName) { V.slaves[_ssi] = _Slave; res.push('</div>'); - if (managerSelectFacility !== undefined) { - if (managerSelectFacility.slaveHasExperiancedForManagerPosition(_Slave)) { + if (passageFacility !== undefined) { + res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); + if (V.Flag === 0) { + res.push(`<<link "Send ${_Slave.object} to ${passageFacility.name}" "Assign">><<set $i = ${_ssi}>><</link>>`); + } else if (V.Flag === 1) { + res.push(`<<link "Remove ${_Slave.object} from ${passageFacility.name}" "Retrieve">><<set $i = ${_ssi}>><</link>>`); + } else if (passageFacility.desc.manager !== null){ + const managerCapName = capFirstChar(passageFacility.desc.manager.position); + res.push(`[[Change or remove ${managerCapName}|${managerCapName} Select]]`); + } + } else if (slaveSelect !== undefined) { + if (slaveSelect.facility.manager.slaveHasExperience(_Slave)) { res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); res.push('@@.lime;Has applicable career experience.@@'); } @@ -5307,153 +5302,12 @@ App.UI.slaveSummaryList = function (passageName) { switch (passageName) { case "Main": continue; - case "HG Select": - if (setup.HGCareers.includes(_Slave.career) || (_Slave.skill.headGirl >= V.masteredXP)) { - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - res.push('@@.lime;Has applicable career experience.@@'); - } - break; - case "Head Girl Suite": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`[[Send her to live with your Head Girl|Assign][$i = ${_ssi}]]`); - } else { - res.push(`[[Bring her out of the Head Girl's suite|Retrieve][$i = ${_ssi}]]`); - } - break; case "Recruiter Select": if (setup.recruiterCareers.includes(_Slave.career) || (_Slave.skill.recruiter >= V.masteredXP)) { res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); res.push('@@.lime;Has applicable career experience.@@'); } break; - case "BG Select": - if (setup.bodyguardCareers.includes(_Slave.career) || (_Slave.skill.bodyguard >= V.masteredXP)) { - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - res.push('@@.lime;Has applicable career experience.@@'); - } - break; - case "Spa": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`<<link "Send ${_Slave.object} to $spaName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else if (V.Flag === 1) { - res.push(`<<link "Remove ${_Slave.object} from ${V.spaName}" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push('[[Change or remove Attendant|Attendant Select]]'); - } - break; - case "Nursery": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`<<link "Send ${_Slave.object} to $nurseryName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else if (V.Flag === 1) { - res.push(`<<link "Remove ${_Slave.object} from $nurseryName" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push('[[Change or remove Matron|Matron Select]]'); - } - break; - case "Brothel": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`<<link "Send ${_Slave.object} to $brothelName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else if (V.Flag === 1) { - res.push(`<<link "Release ${_Slave.object} from $brothelName" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push('[[Change or remove Madam|Madam Select]]'); - } - break; - case "Club": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`<<link "Send ${_Slave.object} to $clubName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else if (V.Flag === 1) { - res.push(`<<link "Remove ${_Slave.object} from $clubName" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push('[[Change or remove DJ|DJ Select]]'); - } - break; - case "Arcade": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`<<link "Confine ${_Slave.object} in $arcadeName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push(`<<link "Release ${_Slave.object} from $arcadeName" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } - break; - case "Clinic": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.clinicUpgradeScanner === 1) { - res.push(`@@.cyan;Estimated DNA error value: ${Math.ceil(_Slave.chem / 10)}@@`); - } - if (V.Flag === 0) { - res.push(`<<link "Send ${_Slave.object} to $clinicName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else if (V.Flag === 1) { - res.push(`<<link "Take ${_Slave.object} out of $clinicName" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push('[[Change or remove Nurse|Nurse Select]]'); - } - break; - case "Schoolroom": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`<<link "Assign ${_Slave.object} to $schoolroomName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else if (V.Flag === 1) { - res.push(`<<link "Release ${_Slave.object} from $schoolroomName" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push('[[Change or remove Schoolteacher|Schoolteacher Select]]'); - } - break; - case "Dairy": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`<<link "Send ${_Slave.object} to $dairyName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else if (V.Flag === 1) { - res.push(`<<link "Release ${_Slave.object} from $dairyName" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push('[[Change or remove Milkmaid|Milkmaid Select]]'); - } - break; - case "Farmyard": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`<<link "Send ${_Slave.object} to $farmyardName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else if (V.Flag === 1) { - res.push(`<<link "Release ${_Slave.object} from $farmyardName" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push('[[Change or remove Farmer|Farmer Select]]'); - } - break; - case "Servants' Quarters": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`<<link "Assign ${_Slave.object} to $servantsQuartersName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else if (V.Flag === 1) { - res.push(`<<link "Release ${_Slave.object} from $servantsQuartersName" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push('[[Change or remove Stewardess|Stewardess Select]]'); - } - break; - case "Master Suite": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`<<link "Add ${_Slave.object} to $masterSuiteName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else if (V.Flag === 1) { - res.push(`<<link "Send ${_Slave.object} out of $masterSuiteName" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push('[[Change or remove Concubine|Concubine Select]]'); - } - break; - case "Cellblock": - res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); - if (V.Flag === 0) { - res.push(`<<link "Confine ${_Slave.object} in $cellblockName" "Assign">><<set $i = ${_ssi}>><</link>>`); - } else if (V.Flag === 1) { - res.push(`<<link "Release ${_Slave.object} from $cellblockName" "Retrieve">><<set $i = ${_ssi}>><</link>>`); - } else { - res.push('[[Change or remove Wardeness|Wardeness Select]]'); - } - break; case "New Game Plus": res.push(`<br>${ V.seeImages !== 1 || V.seeSummaryImages !== 1 || V.imageChoice === 1}` ? ' ' : ''); if (V.Flag === 0) { diff --git a/src/js/utilJS.js b/src/js/utilJS.js index 4d702148361483e3fead571b04b500eb20933180..31adf6b85424cfa1eedf2952f2521802718262f4 100644 --- a/src/js/utilJS.js +++ b/src/js/utilJS.js @@ -1715,7 +1715,20 @@ App.UI.disabledLink = function(link, reasons) { return '<span class="textWithTooltip">' + link + tooltips + '</span>'; } - +/** + * Expresion for SugarCube for referencing a slave by index + * @param {number} i slave array index or -1 for activeSlave + * @returns {string} + */ App.Utils.slaveRefString = function(i) { return i >= 0 ? `$slaves[${i}]` : '$activeSlave'; } + +/** + * Returns slave by index in the slave array, Accepts -1 for the activeSlave + * @param {number} i slave array index or -1 for activeSlave + * @returns {App.Entity.SlaveState} + */ +App.Utils.slaveByIndex = function(i) { + return i === -1 ? State.variables.activeSlave : State.variables.slaves[i]; +} diff --git a/src/npc/agent/agentFramework.js b/src/npc/agent/agentFramework.js new file mode 100644 index 0000000000000000000000000000000000000000..5dab0b51e759c32e1378b583780f4a963250b14e --- /dev/null +++ b/src/npc/agent/agentFramework.js @@ -0,0 +1,47 @@ +App.Data.Facilities.arcologyAgent = { + baseName: "arcololgy", + genericName: null, + jobs: { + agentsSlave: { + position: "agents's toy", + assignment: "live with your agent", + publicSexUse: true, + fuckdollAccepted: false + } + }, + defaultJob: "agentsSlave", + manager: { + position: "agent", + assignment: "be your agent", + careers: null, + skill: null, + publicSexUse: true, + fuckdollAccepted: false, + broodmotherAccepted: false, + shouldWalk: true, + shouldSee: true, + shouldHear: true, + shouldTalk: true, + shouldThink: true, + requiredDevotion: 21 + } +} + +App.Entity.Facilities.AgentJob = class extends App.Entity.Facilities.ManagingJob { + /** + * @param {App.Entity.SlaveState} slave + * @returns {string[]} + */ + canEmploy(slave) { + let r = super.canEmploy(slave); + if (slave.intelligence + slave.intelligenceImplant <= 15) { + r.push(`${slave.slaveName} is not intelligent enough to be your agent.`); + } + return r; + } +} + +App.Entity.facilities.arcologyAgent = new App.Entity.Facilities.Facility( + App.Data.Facilities.arcologyAgent, + new App.Entity.Facilities.AgentJob() +); diff --git a/src/uncategorized/arcade.tw b/src/uncategorized/arcade.tw index 62be9de5d90eb699043808bed7345b749fd3fb19..f0b0ff337eafdf0f475e01a01180a98cee16ec59 100644 --- a/src/uncategorized/arcade.tw +++ b/src/uncategorized/arcade.tw @@ -87,7 +87,7 @@ $arcadeNameCaps <</if>> <</if>> -<br>It can support $arcade inmates. There <<if $arcadeSlaves == 1>>is<<else>>are<</if>> currently $arcadeSlaves <<if $arcadeSlaves != 1>>s<</if>> incarcerated in $arcadeName. +<br>It can support $arcade inmates. There <<if $arcadeSlaves == 1>>is<<else>>are<</if>> currently $arcadeSlaves slaves<<if $arcadeSlaves != 1>>s<</if>> incarcerated in $arcadeName. <<if $arcadeUpgradeFuckdolls == 1 && $arcadeSlaves > 1>> <br>The arcade has automatic fuckdolification functions and you can decide to convert your least popular slave at the end of the week. [[Activate|Arcade][$arcadeUpgradeFuckdolls == 2]] <<elseif $arcadeUpgradeFuckdolls == 2>> @@ -114,7 +114,7 @@ $arcadeNameCaps <</if>> <<if $arcadeUpgradeHealth == 2>> - <br>It has been upgraded with curative injectors and set to maximum power. Inmates will be kept decently healthy so they can be held locked in place for as long as necessary while remaining productive througout. [[Decrease power|Arcade][$arcadeUpgradeHealth = 1]] + <br>It has been upgraded with curative injectors and set to maximum power. Inmates will be kept decently healthy so they can be held locked in place for as long as necessary while remaining productive throughout. [[Decrease power|Arcade][$arcadeUpgradeHealth = 1]] <<elseif $arcadeUpgradeHealth == 1>> <br>It has been upgraded with curative injectors. inmates will be kept alive and productive, so they may be held locked in place for as long as necessary and available for use. [[Increase power|Arcade][$arcadeUpgradeHealth = 2]] | [[Turn off|Arcade][$arcadeUpgradeHealth = 0]] <<elseif $arcadeUpgradeHealth == 0>> diff --git a/src/uncategorized/arcmgmt.tw b/src/uncategorized/arcmgmt.tw index 54d72d7f7c811524977acc08206fd6861a8bb93d..37f67e3fb921f16a638309550a048d1c6d9c770d 100644 --- a/src/uncategorized/arcmgmt.tw +++ b/src/uncategorized/arcmgmt.tw @@ -9,7 +9,7 @@ <<if $arcadeDemandDegResult == 1>> Your endeavors to see slaves as less than human are hampered as citizens find that there are too few slaves ready to be treated as sexual objects around. @@.red;Development towards a degradationist society is damaged@@ as a result.<br> <<elseif $arcadeDemandDegResult == 2>> - Your endeavors to see slaves as less than human are slightly hampered as citizens find that thare are not quite enough slaves ready to be treated as sexual objects around. @@.red;Development towards a degradationist society is lightly damaged@@ as a result.<br> + Your endeavors to see slaves as less than human are slightly hampered as citizens find that there are not quite enough slaves ready to be treated as sexual objects around. @@.red;Development towards a degradationist society is lightly damaged@@ as a result.<br> <<elseif $arcadeDemandDegResult == 3>> Your citizens were expecting to see more slaves available as sexual objects, but there aren't enough complaints to damage your societal development at this time.<br> <<elseif $arcadeDemandDegResult == 4>> @@ -44,7 +44,7 @@ <<elseif $lowerClassSexDemandResult == 4>> Your lower class citizens are @@.green;happy with the availability of sexual services@@ inside your arcology.<br> <<elseif $lowerClassSexDemandResult == 5>> - Your lower class citizens are @@.green;delighted with the abundence of sexual services@@ inside your arcology.<br> + Your lower class citizens are @@.green;delighted with the abundance of sexual services@@ inside your arcology.<br> <</if>> <<print $NPCMarketShareLC/10>>% of the lower class market is serviced by other suppliers operating inside your arcology.<br> @@ -183,7 +183,7 @@ _enslaveChance = 0.2>> _upperClassP *= 1 + Math.trunc(Math.min($arcologies[0].FSTransformationFetishist, 100) / 20) * 0.001, _topClass += Math.trunc(Math.min($arcologies[0].FSTransformationFetishist, 100) / 20) * 0.5, _topClassP *= 1 + Math.trunc(Math.min($arcologies[0].FSTransformationFetishist, 100) / 20) * 0.001>> - The lower class fear the kind of transformations could be forced on them if they ever end up enslaved, whereas the rich enjoy weilding such power. + The lower class fear the kind of transformations could be forced on them if they ever end up enslaved, whereas the rich enjoy wielding such power. <</if>> <<if $arcologies[0].FSYouthPreferentialist != "unset">> <<set _FSScore += Math.min($arcologies[0].FSYouthPreferentialist, 100), @@ -1116,7 +1116,7 @@ _percTopClass = Math.trunc(($topClass / ($ACitizens + $ASlaves)) * 1000) / 10>> <<set _rentMultiplier *= 0.95>> Younger citizens are offered subsidized rent to encourage young people to join the free population of your arcology. <<elseif $arcologies[0].FSMaturityPreferentialistLaw == 1>> - <<set _rentlMultiplier *= 0.95>> + <<set _rentMultiplier *= 0.95>> Older citizens are offered subsidized rent to encourage mature people to join the free population of your arcology. <</if>> <<if $arcologies[0].FSRepopulationFocusLaw == 1>> @@ -1229,7 +1229,7 @@ You own <<if _menialEarnings + _bioreactorEarnings + _fuckdollsEarnings > 0>> earning you @@.yellowgreen;<<print cashFormat(_menialEarnings + _bioreactorEarnings + _fuckdollsEarnings)>>.@@ <<else>> -costing you @@.red;<<print cashFormat(_menialEarnings + _bioreactorEarnings + _fuckdollsEarnings)>>@@ on account of your free fuckdoll policiy. +costing you @@.red;<<print cashFormat(_menialEarnings + _bioreactorEarnings + _fuckdollsEarnings)>>@@ on account of your free fuckdoll policy. <</if>> <</if>> diff --git a/src/uncategorized/bodyModificationReaction.tw b/src/uncategorized/bodyModificationReaction.tw index 59c445d20d558dc1eed196eade96718c96353434..a6756ce8d7c38aa1c8d4097aaadf1da8b1d28815 100644 --- a/src/uncategorized/bodyModificationReaction.tw +++ b/src/uncategorized/bodyModificationReaction.tw @@ -12,7 +12,7 @@ As you cast off $his bindings<<if canSee($activeSlave)>> and <<if ($activeSlave. <<if $activeSlave.fetish != "mindbroken" && $activeSlave.fuckdoll == 0>> <<if $degradation > 10>> <<if $activeSlave.devotion < -20 && $activeSlave.trust > 20>> - $He is appalled by the whorish spectacle you have made of $him. $He @@.mediumorchid;lothes@@ you all the more for this, but $his resolve is @@.gold;whittled down@@ by your power over $him. + $He is appalled by the whorish spectacle you have made of $him. $He @@.mediumorchid;loves@@ you all the more for this, but $his resolve is @@.gold;whittled down@@ by your power over $him. <<set $activeSlave.devotion -= 10, $activeSlave.trust -= 10>> <<elseif $activeSlave.devotion <= 50 && $activeSlave.trust < -50>> $He is appalled by the whorish spectacle you have made of $him. $He @@.gold;fears@@ you all the more for this but is so terrified of you it does not affect $his submission. diff --git a/src/uncategorized/cellblock.tw b/src/uncategorized/cellblock.tw index b0fd72eada40ff70d8d0a081f530e7ad1170430b..1e396b40a2e4b8db39fd545c3d037474f8f357f5 100644 --- a/src/uncategorized/cellblock.tw +++ b/src/uncategorized/cellblock.tw @@ -87,7 +87,7 @@ $cellblockNameCaps <</if>> <<set _Tmult0 = Math.trunc($cellblock*1000*$upgradeMultiplierArcology)>> -<br>$cellblockNameCaps has room for $cellblock slaves to be kept in close confinement. There <<if $cellblockSlaves == 1>>is<<else>>are<</if>> currently $cellblockSlaves <<if $cellblockSlaves != 1>>s<</if>> kept in close confinement in $cellblockName. +<br>$cellblockNameCaps has room for $cellblock slaves to be kept in close confinement. There <<if $cellblockSlaves == 1>>is<<else>>are<</if>> currently $cellblockSlaves slaves<<if $cellblockSlaves != 1>>s<</if>> kept in close confinement in $cellblockName. [[Expand the cellblock|Cellblock][cashX(forceNeg(_Tmult0), "capEx"), $cellblock += 5, $PC.engineering += .1]] //Costs <<print cashFormat(_Tmult0)>>// <br> diff --git a/src/uncategorized/clubReport.tw b/src/uncategorized/clubReport.tw index d665aac59a929593ab42724ea238c973b4bbcd3a..b601dbea3161905611f877b1fa9a594f1ca77c6c 100644 --- a/src/uncategorized/clubReport.tw +++ b/src/uncategorized/clubReport.tw @@ -161,7 +161,7 @@ <</if>> <<if SlaveStatsChecker.isModded($slaves[_FLs])>> <<set _modded += 1>> - <<elseif isUnmodded($slaves[_FLs])>> + <<elseif SlaveStatsChecker.isUnmodded($slaves[_FLs])>> <<set _unmodded += 1>> <</if>> <<if isXY($slaves[_FLs])>> diff --git a/src/uncategorized/costsBudget.tw b/src/uncategorized/costsBudget.tw index 73749106d4b52919ae160828e4a048f5c95dd8ee..8d3bd616b3405180f6624643cf3f0b118ce6eeda 100644 --- a/src/uncategorized/costsBudget.tw +++ b/src/uncategorized/costsBudget.tw @@ -1,6 +1,6 @@ :: Costs Budget [nobr] -<<set $nextButton = "Back to Main", $nextLink = "Main", _archologyCosts = 0>> +<<set $nextButton = "Back to Main", $nextLink = "Main", _arcologyCosts = 0>> <<if def $lastWeeksCashIncome>> <<set $lastWeeksCashIncome.Total = 0>> diff --git a/src/uncategorized/costsWidgets.tw b/src/uncategorized/costsWidgets.tw index ebcbad46848bbc996e142b3971a46309a173fdd1..fd33a509e5336b256d4b3687cc6e3df3bbca6398 100644 --- a/src/uncategorized/costsWidgets.tw +++ b/src/uncategorized/costsWidgets.tw @@ -110,7 +110,7 @@ <<if $geneticMappingUpgrade >= 1>> <i>Additional dietary supplements due to genetic hyper-fertility:</i> @@.yellowgreen;<<print cashFormat($foodCost/2)>>@@ <<else>> - <i>Adjustment for unusual deitary deficiencies:</i> @@.yellowgreen;<<print cashFormat($foodCost/2)>>@@ + <i>Adjustment for unusual dietary deficiencies:</i> @@.yellowgreen;<<print cashFormat($foodCost/2)>>@@ <</if>> <<set _individualCosts += $foodCost/2>> <</if>> @@ -119,7 +119,7 @@ <<if $geneticMappingUpgrade >= 1>> <i>Additional dietary supplements due to lipedema:</i> @@.yellowgreen;<<print cashFormat($foodCost/5)>>@@ <<else>> - <i>Adjustment for unusual deitary deficiencies:</i> @@.yellowgreen;<<print cashFormat($foodCost/5)>>@@ + <i>Adjustment for unusual dietary deficiencies:</i> @@.yellowgreen;<<print cashFormat($foodCost/5)>>@@ <</if>> <<set _individualCosts += $foodCost/5>> <</if>> diff --git a/src/uncategorized/dairy.tw b/src/uncategorized/dairy.tw index 7941c7f5aeffa5e919214b67e49692a4cda1dd77..e5e43cfcc6167a78a10bdb2935455195f9ed6cb1 100644 --- a/src/uncategorized/dairy.tw +++ b/src/uncategorized/dairy.tw @@ -449,16 +449,16 @@ $dairyNameCaps <<if $dairySlimMaintain == 0>> <<if $dairyImplantsSetting == 1>> All cows will undergo lactation implant surgery to increase their milk output. - [[Restrict lactation surgery on cum-cows|Dairy][$dairyImplantsSetting = 0]] | [[Restrict maximization surgery on cattle|Dairy][$dairyImplantsSetting = 2]] | [[Encourage natural lacation in cattle|Dairy][$dairyImplantsSetting = 3]] + [[Restrict lactation surgery on cum-cows|Dairy][$dairyImplantsSetting = 0]] | [[Restrict maximization surgery on cattle|Dairy][$dairyImplantsSetting = 2]] | [[Encourage natural lactation in cattle|Dairy][$dairyImplantsSetting = 3]] <<elseif $dairyImplantsSetting == 2>> Cows will not undergo surgical procedures to maximize production. - [[Maximize production in all cattle|Dairy][$dairyImplantsSetting = 1]] | [[Maximize production in only milkable cows|Dairy][$dairyImplantsSetting = 0]] | [[Encourage natural lacation in cattle|Dairy][$dairyImplantsSetting = 3]] + [[Maximize production in all cattle|Dairy][$dairyImplantsSetting = 1]] | [[Maximize production in only milkable cows|Dairy][$dairyImplantsSetting = 0]] | [[Encourage natural lactation in cattle|Dairy][$dairyImplantsSetting = 3]] <<elseif $dairyImplantsSetting == 3>> Non-lactating cows incapable of producing cum will undergo manual stimulation to promote natural production. [[Maximize production in all cattle|Dairy][$dairyImplantsSetting = 1]] | [[Maximize production in only milkable cows|Dairy][$dairyImplantsSetting = 0]] | [[Restrict maximization surgery on cattle|Dairy][$dairyImplantsSetting = 2]] <<else>> Naturally lactating cows, cows with non-lactating breasts, and cows incapable of producing cum will undergo lactation implant surgery to increase their milk output. - [[Maximize lactation in all cattle|Dairy][$dairyImplantsSetting = 1]] | [[Restrict maximization surgery on cattle|Dairy][$dairyImplantsSetting = 2]] | [[Encourage natural lacation in cattle|Dairy][$dairyImplantsSetting = 3]] + [[Maximize lactation in all cattle|Dairy][$dairyImplantsSetting = 1]] | [[Restrict maximization surgery on cattle|Dairy][$dairyImplantsSetting = 2]] | [[Encourage natural lactation in cattle|Dairy][$dairyImplantsSetting = 3]] <</if>> <<else>> Current settings do not implant lactation implants into cows. diff --git a/src/uncategorized/dairyReport.tw b/src/uncategorized/dairyReport.tw index 040acdcfccdf3aa4e201f63a0060312ebbb0bfbd..8dc3f1ead0e9fb0439fcd18d1facd59273e344b1 100644 --- a/src/uncategorized/dairyReport.tw +++ b/src/uncategorized/dairyReport.tw @@ -438,12 +438,13 @@ <<set $slaves[$i].inflation = 0, $slaves[$i].inflationType = "none", $slaves[$i].inflationMethod = 0, $slaves[$i].milkSource = 0>> <<run SetBellySize($slaves[$i])>> <</if>> + <<set _gigantomastiaMod = $slaves[$i].geneticQuirks.gigantomastia == 2 ? ($slaves[$i].geneticQuirks.macromastia == 2 ? 3 : 2) : 1>> <<if ($slaves[$i].lactation > 0) && (($dairySlimMaintain == 0) || ($slaves[$i].boobs > 700))>> <<if ($slaves[$i].boobs < 2000)>> <<set _growth = 100>> - <<elseif ($slaves[$i].boobs < 5000)>> + <<elseif ($slaves[$i].boobs < 5000*_gigantomastiaMod)>> <<set _growth = 50>> - <<elseif ($slaves[$i].boobs < 10000)>> + <<elseif ($slaves[$i].boobs < 10000*_gigantomastiaMod)>> <<set _growth = 25>> <<else>> <<set _growth = 0>> @@ -491,7 +492,7 @@ <<if $arcologies[0].FSAssetExpansionistResearch == 1>> <<if ($slaves[$i].boobs < 2000)>> <<set _growth = 75*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> - <<elseif ($slaves[$i].boobs < 5000)>> + <<elseif ($slaves[$i].boobs < 5000*_gigantomastiaMod)>> <<set _growth = 50*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> <<else>> <<set _growth = 25*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> @@ -507,14 +508,14 @@ <</if>> <<set $slaves[$i].boobs += _growth>> <<else>> - <<set $slaves[$i].boobs = 50000>> + /*<<set $slaves[$i].boobs = 50000>>*/ <</if>> <<elseif $dairyFeedersSetting > 0 && $dairyStimulatorsSetting > 0>> <<if $slaves[$i].boobs < 25000>> <<if $arcologies[0].FSAssetExpansionistResearch == 1>> <<if ($slaves[$i].boobs < 2000)>> <<set _growth = 75*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> - <<elseif ($slaves[$i].boobs < 5000)>> + <<elseif ($slaves[$i].boobs < 5000*_gigantomastiaMod)>> <<set _growth = 50*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> <<else>> <<set _growth = 25*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> @@ -535,7 +536,7 @@ <<if $arcologies[0].FSAssetExpansionistResearch == 1>> <<if ($slaves[$i].boobs < 2000)>> <<set _growth = 75*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> - <<elseif ($slaves[$i].boobs < 5000)>> + <<elseif ($slaves[$i].boobs < 5000*_gigantomastiaMod)>> <<set _growth = 50*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> <<else>> <<set _growth = 25*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> @@ -556,7 +557,7 @@ <<if $arcologies[0].FSAssetExpansionistResearch == 1>> <<if ($slaves[$i].boobs < 2000)>> <<set _growth = 75*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> - <<elseif ($slaves[$i].boobs < 5000)>> + <<elseif ($slaves[$i].boobs < 5000*_gigantomastiaMod)>> <<set _growth = 50*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> <<else>> <<set _growth = 25*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> @@ -623,7 +624,7 @@ <<if $arcologies[0].FSAssetExpansionistResearch == 1>> <<if ($slaves[$i].boobs < 2000)>> <<set _growth = 75*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> - <<elseif ($slaves[$i].boobs < 5000)>> + <<elseif ($slaves[$i].boobs < 5000*_gigantomastiaMod)>> <<set _growth = 50*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> <<else>> <<set _growth = 25*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> @@ -644,7 +645,7 @@ <<if $arcologies[0].FSAssetExpansionistResearch == 1>> <<if ($slaves[$i].boobs < 2000)>> <<set _growth = 75*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> - <<elseif ($slaves[$i].boobs < 5000)>> + <<elseif ($slaves[$i].boobs < 5000*_gigantomastiaMod)>> <<set _growth = 50*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> <<else>> <<set _growth = 25*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> @@ -665,7 +666,7 @@ <<if $arcologies[0].FSAssetExpansionistResearch == 1>> <<if ($slaves[$i].boobs < 2000)>> <<set _growth = 75*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> - <<elseif ($slaves[$i].boobs < 5000)>> + <<elseif ($slaves[$i].boobs < 5000*_gigantomastiaMod)>> <<set _growth = 50*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> <<else>> <<set _growth = 25*Math.trunc(($injectionUpgrade*2)+$dairyFeedersSetting+$dairyRestraintsSetting+((50)/4))>> diff --git a/src/uncategorized/futureSociety.tw b/src/uncategorized/futureSociety.tw index 67a19c9b6fd00d1a91721d510ab889d17c67a196..ee2c5d1bd8ad69fb9525dca7f2652f26942c7ac6 100644 --- a/src/uncategorized/futureSociety.tw +++ b/src/uncategorized/futureSociety.tw @@ -649,7 +649,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSSupremacist != "unset" && $arcologies[0].FSSupremacistRace == "amerindian">>//It is established that amerindians are superior//<<elseif $arcologies[0].FSSubjugationistRace != "amerindian">>[[Amerindian|Future Society][$arcologies[0].FSSubjugationistRace = "amerindian"]]<<else>>Amerindian<</if>> | <<if $arcologies[0].FSSupremacist != "unset" && $arcologies[0].FSSupremacistRace == "pacific islander">>//It is established that pacific islanders are superior//<<elseif $arcologies[0].FSSubjugationistRace != "pacific islander">>[[Pacific Islander|Future Society][$arcologies[0].FSSubjugationistRace = "pacific islander"]]<<else>>Pacific Islander<</if>> | <<if $arcologies[0].FSSupremacist != "unset" && $arcologies[0].FSSupremacistRace == "malay">>//It is established that malay are superior//<<elseif $arcologies[0].FSSubjugationistRace != "malay">>[[Malay|Future Society][$arcologies[0].FSSubjugationistRace = "malay"]]<<else>>Malay<</if>> | - <<if $arcologies[0].FSSupremacist != "unset" && $arcologies[0].FSSupremacistRace == "southern european">>//It is established that southern europeaners are superior//<<elseif $arcologies[0].FSSubjugationistRace != "southern european">>[[Southern European|Future Society][$arcologies[0].FSSubjugationistRace = "southern european"]]<<else>>Southern European<</if>> | + <<if $arcologies[0].FSSupremacist != "unset" && $arcologies[0].FSSupremacistRace == "southern european">>//It is established that southern europeans are superior//<<elseif $arcologies[0].FSSubjugationistRace != "southern european">>[[Southern European|Future Society][$arcologies[0].FSSubjugationistRace = "southern european"]]<<else>>Southern European<</if>> | <<if $arcologies[0].FSSupremacist != "unset" && $arcologies[0].FSSupremacistRace == "semitic">>//It is established that semites are superior//<<elseif $arcologies[0].FSSubjugationistRace != "semitic">>[[Semitic|Future Society][$arcologies[0].FSSubjugationistRace = "semitic"]]<<else>>Semitic<</if>> | <<if $arcologies[0].FSSupremacist != "unset" && $arcologies[0].FSSupremacistRace == "mixed race">>//It is established that those with mixed blood are superior//<<elseif $arcologies[0].FSSubjugationistRace != "mixed race">>[[Mixed Race|Future Society][$arcologies[0].FSSubjugationistRace = "mixed race"]]<<else>>Mixed Race<</if>> <br> diff --git a/src/uncategorized/manageArcology.tw b/src/uncategorized/manageArcology.tw index 2e3f889976f169dc7be810906e656cad58ab079b..7d29124cc361317b43b0da8130fc2b8ebf9145b2 100644 --- a/src/uncategorized/manageArcology.tw +++ b/src/uncategorized/manageArcology.tw @@ -142,7 +142,7 @@ __Construction__ <<if $difficultySwitch == 1>> <br><br> - __Disaster Repsonse__<br> + __Disaster Response__<br> <<if $econWeatherDamage > 0>> The recent terrible weather has damaged the local infrastructure. It is @@.red;reducing the local economy score by <<print $econWeatherDamage>>.@@ <<if $disasterResponse == 0>> @@ -180,15 +180,15 @@ Currently outside parties are providing <<print $NPCMarketShareLC/10>>% of the s You are providing a gratuitous subsidy for those selling sexual services to the lower class. //Upkeep is relative to the amount of sex provided by other parties// [[Substantial Subsidy|Manage Arcology][$NPCSexSubsidiesLC = 3]]<br> <</if>> <<if $sexSupplyBarriersLC == 0>> - You can make things more difficult for those supplying sexual services in the lower class segment if you are willing to spend 1000 reputation and pay a flat upkeep of @@.yellowgreen;<<print cashFormat(1000)>>.@@ <<if $rep > 1000>>[[Create Beauraucracy|Manage Arcology][$sexSupplyBarriersLC = 1, repX(-1000, "policies")]] <<else>>//You are not reputable enough//<</if>> + You can make things more difficult for those supplying sexual services in the lower class segment if you are willing to spend 1000 reputation and pay a flat upkeep of @@.yellowgreen;<<print cashFormat(1000)>>.@@ <<if $rep > 1000>>[[Create Bureaucracy|Manage Arcology][$sexSupplyBarriersLC = 1, repX(-1000, "policies")]] <<else>>//You are not reputable enough//<</if>> <<elseif $sexSupplyBarriersLC == 1>> - You have forced some unneeded beauraucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the beauraucracy further will cost a flat upkeep of @@.yellowgreen;<<print cashFormat(5000)>>.@@ <<if $rep > 1000>>[[Abolish Beauraucracy|Manage Arcology][$sexSupplyBarriersLC = 0, repX(-1000, "policies")]] | [[Increase Beauraucracy|Manage Arcology][$sexSupplyBarriersLC = 2, repX(-1000, "policies")]]<<else>>//You are not reputable enough//<</if>> + You have forced some unneeded bureaucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of @@.yellowgreen;<<print cashFormat(5000)>>.@@ <<if $rep > 1000>>[[Abolish Bureaucracy|Manage Arcology][$sexSupplyBarriersLC = 0, repX(-1000, "policies")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriersLC = 2, repX(-1000, "policies")]]<<else>>//You are not reputable enough//<</if>> <<elseif $sexSupplyBarriersLC == 2>> - You have forced considerable beauraucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the beauraucracy further will cost a flat upkeep of @@.yellowgreen;<<print cashFormat(20000)>>.@@ <<if $rep > 1000>>[[Reduce Beauraucracy|Manage Arcology][$sexSupplyBarriersLC = 1, repX(-1000, "policies")]] | [[Increase Beauraucracy|Manage Arcology][$sexSupplyBarriersLC = 3, repX(-1000, "policies")]]<<else>>//You are not reputable enough//<</if>> + You have forced considerable bureaucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of @@.yellowgreen;<<print cashFormat(20000)>>.@@ <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriersLC = 1, repX(-1000, "policies")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriersLC = 3, repX(-1000, "policies")]]<<else>>//You are not reputable enough//<</if>> <<elseif $sexSupplyBarriersLC == 3>> - You have forced stiffling beauraucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the beauraucracy further will cost a flat upkeep of @@.yellowgreen;<<print cashFormat(60000)>>.@@ <<if $rep > 1000>>[[Reduce Beauraucracy|Manage Arcology][$sexSupplyBarriersLC = 2, repX(-1000, "policies")]] | [[Increase Beauraucracy|Manage Arcology][$sexSupplyBarriersLC = 4, repX(-1000, "policies")]]<<else>>//You are not reputable enough//<</if>> + You have forced stifling bureaucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. Increasing the bureaucracy further will cost a flat upkeep of @@.yellowgreen;<<print cashFormat(60000)>>.@@ <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriersLC = 2, repX(-1000, "policies")]] | [[Increase Bureaucracy|Manage Arcology][$sexSupplyBarriersLC = 4, repX(-1000, "policies")]]<<else>>//You are not reputable enough//<</if>> <<else>> - You have forced suffocating beauraucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. <<if $rep > 1000>>[[Reduce Beauraucracy|Manage Arcology][$sexSupplyBarriersLC = 3, repX(-1000, "policies")]]<<else>>//You are not reputable enough//<</if>> + You have forced suffocating bureaucracy on those selling sexual services to the lower class making things a little more difficult. If you are willing to spend 1000 reputation you can change this policy. <<if $rep > 1000>>[[Reduce Bureaucracy|Manage Arcology][$sexSupplyBarriersLC = 3, repX(-1000, "policies")]]<<else>>//You are not reputable enough//<</if>> <</if>> <br><br> diff --git a/src/uncategorized/repBudget.tw b/src/uncategorized/repBudget.tw index f88244e1885626dbaab12d3553679f0f50267c1f..368a0bf11ce8a6a1aa2087ec039d25ed380b3a6f 100644 --- a/src/uncategorized/repBudget.tw +++ b/src/uncategorized/repBudget.tw @@ -1,6 +1,6 @@ :: Rep Budget [nobr] -<<set $nextButton = "Back to Main", $nextLink = "Main", _archologyCosts = 0>> +<<set $nextButton = "Back to Main", $nextLink = "Main", _arcologyCosts = 0>> <<set $lastWeeksRepIncome.Total = 0>> <<set $lastWeeksRepExpenses.Total = 0>> diff --git a/src/uncategorized/schoolroom.tw b/src/uncategorized/schoolroom.tw index bb15e1b52fe2e6999321e83bf1028e8bf002d820..0e5804136ef95699c49b6252bc64248b04d3a29f 100644 --- a/src/uncategorized/schoolroom.tw +++ b/src/uncategorized/schoolroom.tw @@ -89,7 +89,7 @@ $schoolroomNameCaps is well-equipped, with wallscreens to display lessons. These <</if>> <<set _Tmult0 = Math.trunc($schoolroom*1000*$upgradeMultiplierArcology)>> -<br>$schoolroomNameCaps has room to house $schoolroom slaves while they learn. There <<if $schoolroomSlaves == 1>>is<<else>>are<</if>> currently $schoolroomSlaves <<if $schoolroomSlaves != 1>>s<</if>> learning in $schoolroomName. +<br>$schoolroomNameCaps has room to house $schoolroom slaves while they learn. There <<if $schoolroomSlaves == 1>>is<<else>>are<</if>> currently $schoolroomSlaves slave<<if $schoolroomSlaves != 1>>s<</if>> learning in $schoolroomName. [[Expand the schoolroom|Schoolroom][cashX(forceNeg(_Tmult0), "capEx"), $schoolroom += 5, $PC.engineering += .1]] //Costs <<print cashFormat(_Tmult0)>>// <br> diff --git a/src/uncategorized/servantsQuarters.tw b/src/uncategorized/servantsQuarters.tw index 546766faf616dd850c6b13eb2cc500ac36562ae6..879198bd2f3271393da4ca480ed601f30e6406c8 100644 --- a/src/uncategorized/servantsQuarters.tw +++ b/src/uncategorized/servantsQuarters.tw @@ -87,7 +87,7 @@ $servantsQuartersNameCaps <</if>> <<set _Tmult0 = Math.trunc($servantsQuarters*1000*$upgradeMultiplierArcology)>> -<br>$servantsQuartersNameCaps has room to keep $servantsQuarters slaves while they serve. There <<if $servantsQuartersSlaves == 1>>is<<else>>are<</if>> currently $servantsQuartersSlaves <<if $servantsQuartersSlaves != 1>>s<</if>> serving in $servantsQuartersName. +<br>$servantsQuartersNameCaps has room to keep $servantsQuarters slaves while they serve. There <<if $servantsQuartersSlaves == 1>>is<<else>>are<</if>> currently $servantsQuartersSlaves slaves<<if $servantsQuartersSlaves != 1>>s<</if>> serving in $servantsQuartersName. [[Expand the Servants' Quarters|Servants' Quarters][cashX(forceNeg(_Tmult0), "capEx"), $servantsQuarters += 5, $PC.engineering += .1]] //Costs <<print cashFormat(_Tmult0)>>// <br> diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw index e627340ea14e2b4f7c4b26fcd8db8a957e0b07c5..c0aa029f59dd53df7cd270dff250f157bec445ad 100644 --- a/src/uncategorized/slaveInteract.tw +++ b/src/uncategorized/slaveInteract.tw @@ -1071,9 +1071,9 @@ <</if>> <<if $growthStim == 1>> <<if $activeSlave.height < 274 && $activeSlave.height < Math.clamp((Height.mean($activeSlave) * 1.25),0,274)>> - | <<link "Growth Stimulants">><<set $activeSlave.drugs = "growth stimulants">><<SlaveInteractDrugs>><</link>> + | <<link "Growth stimulants">><<set $activeSlave.drugs = "growth stimulants">><<SlaveInteractDrugs>><</link>> <<else>> - | Growth Stimulants + | Growth stimulants <</if>> <</if>> | <<link "Fertility">><<set $activeSlave.drugs = "fertility drugs">><<SlaveInteractDrugs>><</link>> diff --git a/src/uncategorized/spa.tw b/src/uncategorized/spa.tw index 400c8d9ac7924f473299205b604029b7f76ddbff..365de16c72667fb97e74655092b5a2370d7226bb 100644 --- a/src/uncategorized/spa.tw +++ b/src/uncategorized/spa.tw @@ -88,7 +88,7 @@ $spaNameCaps <</if>> <<set _Tmult0 = Math.trunc($spa*1000*$upgradeMultiplierArcology)>> -<br>$spaNameCaps can house $spa slaves while they recuperate here. There <<if $spaSlaves == 1>>is<<else>>are<</if>> currently $spaSlaves <<if $spaSlaves != 1>>s<</if>> recuperating in $spaName. +<br>$spaNameCaps can house $spa slaves while they recuperate here. There <<if $spaSlaves == 1>>is<<else>>are<</if>> currently $spaSlaves slaves<<if $spaSlaves != 1>>s<</if>> recuperating in $spaName. [[Expand the spa|Spa][cashX(forceNeg(_Tmult0), "capEx"), $spa += 5]] //Costs <<print cashFormat(_Tmult0)>>// <br> diff --git a/src/utility/descriptionWidgets.tw b/src/utility/descriptionWidgets.tw index 7b85c5a8aefe811c609f58590a22ca8934fe6599..0c5851398a49547d17c87d6d05fb816e6ecce465 100644 --- a/src/utility/descriptionWidgets.tw +++ b/src/utility/descriptionWidgets.tw @@ -94,7 +94,7 @@ <<if $activeSlave.geneticQuirks.pFace == 2>> $He has an exceedingly rare trait associated with perfect facial beauty. <<if $activeSlave.geneticQuirks.uFace == 2>> - Oddly enough, $he also possesses a conflicting trait for raw uglyness; the two average each other out. + Oddly enough, $he also possesses a conflicting trait for raw ugliness; the two average each other out. <</if>> <<elseif $activeSlave.geneticQuirks.uFace == 2>> $He has an exceedingly rare trait associated with some of the ugliest mugs in history. diff --git a/src/utility/descriptionWidgetsStyle.tw b/src/utility/descriptionWidgetsStyle.tw index 99a1ab597215c8f4da73cda42ba4ad72abbdeb98..1b2819d556b0d308bcf4bf16906d53c8233bcc7e 100644 --- a/src/utility/descriptionWidgetsStyle.tw +++ b/src/utility/descriptionWidgetsStyle.tw @@ -147,7 +147,7 @@ $activeSlave.slaveName is $His lingerie is white, since $he has a virgin asspussy, <<elseif ($activeSlave.fetish == "dom") || ($activeSlave.fetish == "sadist")>> $He's gone with black lingerie to look a bit more intimidating, - <<elseif ($activeSlave.hormoneBlance < 0)>> + <<elseif ($activeSlave.hormoneBalance < 0)>> $He's gone with blue lingerie for some reason, <<elseif ($activeSlave.dick > 0) && ($activeSlave.balls == 0)>> The lingerie is girly pink, @@ -167,7 +167,7 @@ $activeSlave.slaveName is $His lingerie is white, since $he has a virgin asspussy, <<elseif ($activeSlave.fetish == "dom") || ($activeSlave.fetish == "sadist")>> $He's gone with black lingerie to look a bit more intimidating, - <<elseif ($activeSlave.hormoneBlance < 0)>> + <<elseif ($activeSlave.hormoneBalance < 0)>> $He's gone with blue lingerie for some reason, <<elseif ($activeSlave.dick > 0) && ($activeSlave.balls == 0)>> The lingerie is girly pink, @@ -1529,7 +1529,7 @@ $His <<if $activeSlave.hLength > 100>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is pulled back with a pair of simple hairties into tails. + is pulled back with a pair of simple hair ties into tails. <<case "chains">> is back in tails secured by steel rings. <<case "a latex catsuit">> @@ -1607,7 +1607,7 @@ $His <<elseif $activeSlave.hLength > 30>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is pulled back with a pair of simple hairties into tails. + is pulled back with a pair of simple hair ties into tails. <<case "chains">> is back in tails secured by steel rings. <<case "a latex catsuit">> @@ -1685,7 +1685,7 @@ $His <<elseif $activeSlave.hLength > 10>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is pulled back with a pair of simple hairties into short tails. + is pulled back with a pair of simple hair ties into short tails. <<case "chains">> is back in short tails secured by steel rings. <<case "a latex catsuit">> @@ -1794,7 +1794,7 @@ $His <<if $activeSlave.hLength > 100>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is tied back with a simple hairtie into a long ponytail. + is tied back with a simple hair tie into a long ponytail. <<case "chains">> is tied back into a ponytail secured by steel rings. <<case "a latex catsuit">> @@ -1872,7 +1872,7 @@ $His <<elseif $activeSlave.hLength > 30>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is pulled back with a simple hairtie into a ponytail. + is pulled back with a simple hair tie into a ponytail. <<case "chains">> is tied back in a ponytail secured by steel rings. <<case "a latex catsuit">> @@ -1950,7 +1950,7 @@ $His <<elseif $activeSlave.hLength > 10>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is pulled back with a simple hairtie into short ponytail. + is pulled back with a simple hair tie into short ponytail. <<case "chains">> is back in a short ponytail secured by steel rings. <<case "a latex catsuit">> @@ -2041,7 +2041,7 @@ $His <<if $activeSlave.hLength > 100>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is pulled back with a pair of simple hairties into braids. + is pulled back with a pair of simple hair ties into braids. <<case "chains">> is back in braids secured by steel rings. <<case "Western clothing">> @@ -2115,7 +2115,7 @@ $His <<elseif $activeSlave.hLength > 30>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is pulled back with simple hairties into braids. + is pulled back with simple hair ties into braids. <<case "chains">> is back in braids secured by steel rings. <<case "Western clothing">> @@ -2189,7 +2189,7 @@ $His <<elseif $activeSlave.hLength > 10>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is pulled back with a pair of simple hairties into short braids. + is pulled back with a pair of simple hair ties into short braids. <<case "chains">> is back in short braids secured by steel rings. <<case "Western clothing">> @@ -2428,7 +2428,7 @@ $His <<elseif $activeSlave.hLength > 10>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is in short dreadlocks, some in simple hairties. + is in short dreadlocks, some in simple hair ties. <<case "chains">> is in short dreadlocks, some with steel rings. <<case "Western clothing">> @@ -2663,7 +2663,7 @@ $His <<elseif $activeSlave.hLength > 10>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is curled into short locks secured by simple hairties. + is curled into short locks secured by simple hair ties. <<case "chains">> is curled into short locks secured by steel rings. <<case "Western clothing">> @@ -2770,7 +2770,7 @@ $His <<case "uncomfortable straps">> is permed into long flowing curls secured by leather ties. <<case "shibari rope">> - is in long dreadcurls, some simply tied with string. + is in long dreadlocks, some simply tied with string. <<case "restrictive latex">> is permed into long flowing curls poking out of a hole in $his latex hood. <<case "a string bikini" "cutoffs and a t-shirt" "a schoolgirl outfit" "a slutty maid outfit" "striped panties">> @@ -2898,7 +2898,7 @@ $His <<elseif $activeSlave.hLength > 10>> <<switch $activeSlave.clothes>> <<case "conservative clothing">> - is permed into short waves secured by simple hairties. + is permed into short waves secured by simple hair ties. <<case "chains">> is permed into short waves secured by steel rings. <<case "Western clothing">> diff --git a/src/utility/saRulesWidgets.tw b/src/utility/saRulesWidgets.tw index 197b900dbc1bd96b248556a7b32061bdd31973f3..65c209c7242e54397fe6f9d7ed8fa387c9b55b04 100644 --- a/src/utility/saRulesWidgets.tw +++ b/src/utility/saRulesWidgets.tw @@ -193,7 +193,7 @@ and <<set $slaves[$i].trust += 1>> <</if>> <<else>> - $He refuses to come to you for help with $his terribly swollen balls, no matter how backed up $he becomes. The intense blueballing only @@.mediumorchid;makes $him dislike you more.@@ + $He refuses to come to you for help with $his terribly swollen balls, no matter how backed up $he becomes. The intense blue-balling only @@.mediumorchid;makes $him dislike you more.@@ <<set $slaves[$i].devotion -= 1>> <</if>> <<elseif $slaves[$i].drugs == "hyper testicle enhancement">> @@ -222,7 +222,7 @@ and <<set $slaves[$i].trust += 1>> <</if>> <<else>> - $He refuses to come to you for help with $his grotesquely swollen balls, no matter how backed up and sore $he becomes. The intense blueballing only @@.mediumorchid;makes $him hate you more.@@ + $He refuses to come to you for help with $his grotesquely swollen balls, no matter how backed up and sore $he becomes. The intense blue-balling only @@.mediumorchid;makes $him hate you more.@@ <<set $slaves[$i].devotion -= 3>> <</if>> <</if>>