diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index 0a3cbb9e094c031bf45ea4aae64ee9a9640170ee..16aa0642711d0d91a09d3da4fdb20b8e44cc5c41 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -64,6 +64,7 @@ App.Data.defaultGameStateVariables = { FSNamePref: 0, HGFormality: 1, HGSeverity: 0, + HGPiercings: 1, abbreviateSidebar: 1, adamPrinciple: 0, allowFamilyTitles: 0, @@ -363,7 +364,6 @@ App.Data.resetOnNGPlus = { eliteAuctioned: 0, slavesSacrificedThisWeek: 0, - HGtraining: "", mercenariesTitle: "", hormones: 0, FSReminder: 0, diff --git a/js/003-data/miscData.js b/js/003-data/miscData.js index 34d649d8b22098c1c1c3f00accfb9f14eff2f393..49dd193da628e3b133346b71704ab7dc9096dd1e 100644 --- a/js/003-data/miscData.js +++ b/js/003-data/miscData.js @@ -1554,9 +1554,9 @@ App.Data.misc = { fakeBellies: ["a huge empathy belly", "a large empathy belly", "a medium empathy belly", "a small empathy belly"], /* lets fake bellies be separated from other .bellyAccessory */ - modestClothes: ["a ball gown", "a biyelgee costume", "a bunny outfit", "a burkini", "a burqa", "a comfortable bodysuit", "a cybersuit", "a dirndl", "a gothic lolita dress", "a halter top dress", "a hanbok", "a hijab and abaya", "a hijab and blouse", "a huipil", "a kimono", "a klan robe", "a latex catsuit", "a leotard", "a long qipao", "a maternity dress", "a military uniform", "a mini dress", "a mounty outfit", "a nice maid outfit", "a nice nurse outfit", "a niqab and abaya", "a one-piece swimsuit", "a penitent nuns habit", "a police uniform", "a red army uniform", "a schoolgirl outfit", "a schutzstaffel uniform", "a slave gown", "a slutty maid outfit", "a slutty nurse outfit", "a slutty qipao", "a sweater and cutoffs", "a t-shirt and jeans", "a toga", "an oversized t-shirt and boyshorts", "battlearmor", "battledress", "conservative clothing", "cutoffs and a t-shirt", "leather pants and a tube top", "lederhosen", "nice business attire", "restrictive latex", "slutty business attire", "spats and a tank top", "sport shorts and a sports bra", "sport shorts and a t-shirt", "stretch pants and a crop-top", "Imperial Plate",], + modestClothes: ["a ball gown", "a biyelgee costume", "a bunny outfit", "a burkini", "a burqa", "a comfortable bodysuit", "a cybersuit", "a dirndl", "a gothic lolita dress", "a halter top dress", "a hanbok", "a hijab and abaya", "a hijab and blouse", "a huipil", "a kimono", "a klan robe", "a latex catsuit", "a leotard", "a long qipao", "a maternity dress", "a military uniform", "a mini dress", "a mounty outfit", "a nice maid outfit", "a nice nurse outfit", "a niqab and abaya", "a one-piece swimsuit", "a penitent nuns habit", "a police uniform", "a red army uniform", "a schoolgirl outfit", "a schutzstaffel uniform", "a slave gown", "a slutty maid outfit", "a slutty nurse outfit", "a slutty qipao", "a sweater and cutoffs", "a t-shirt and jeans", "a toga", "an oversized t-shirt and boyshorts", "battlearmor", "battledress", "conservative clothing", "cutoffs and a t-shirt", "leather pants and a tube top", "lederhosen", "nice business attire", "restrictive latex", "slutty business attire", "spats and a tank top", "sport shorts and a sports bra", "sport shorts and a t-shirt", "stretch pants and a crop-top", "Imperial Plate"], - sluttyClothes: ["a bimbo outfit", "a chattel habit", "a cheerleader outfit", "a fallen nuns habit", "a schoolgirl outfit", "a skimpy loincloth", "a slutty klan robe", "a slutty maid outfit", "a slutty nurse outfit", "a slutty outfit", "a slutty pony outfit", "a slutty qipao", "a slutty schutzstaffel uniform", "a string bikini", "a succubus outfit", "a t-shirt and panties", "a t-shirt and thong", "a tank-top and panties", "a tube top and thong", "attractive lingerie", "attractive lingerie for a pregnant woman", "clubslut netting", "kitty lingerie", "leather pants and a tube top", "leather pants and pasties", "panties and pasties", "pasties", "slutty business attire", "slutty jewelry", "sport shorts and a sports bra", "striped underwear", "a tight Imperial bodysuit",], + sluttyClothes: ["a bimbo outfit", "a chattel habit", "a cheerleader outfit", "a fallen nuns habit", "a schoolgirl outfit", "a skimpy loincloth", "a slutty klan robe", "a slutty maid outfit", "a slutty nurse outfit", "a slutty outfit", "a slutty pony outfit", "a slutty qipao", "a slutty schutzstaffel uniform", "a string bikini", "a succubus outfit", "a t-shirt and panties", "a t-shirt and thong", "a tank-top and panties", "a tube top and thong", "attractive lingerie", "attractive lingerie for a pregnant woman", "clubslut netting", "kitty lingerie", "leather pants and a tube top", "leather pants and pasties", "panties and pasties", "pasties", "slutty business attire", "slutty jewelry", "sport shorts and a sports bra", "striped underwear", "a tight Imperial bodysuit"], /* stuff that reveals genitals */ humiliatingClothes: ["a bra", "a button-up shirt", "a chattel habit", "a fallen nuns habit", "a skimpy loincloth", "a sports bra", "a string bikini", "a striped bra", "a succubus outfit", "a sweater", "a t-shirt", "a tank-top", "a thong", "a tube top", "clubslut netting", "pasties", "restrictive latex", "shibari ropes", "slutty jewelry", "uncomfortable straps", "Western clothing"], diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js index b748bfaf42ff7d5a0bcfa3e231e73a69fbbdfb1d..4a33309be7527b7d23479dd55d44930de38fcb47 100644 --- a/src/data/backwardsCompatibility/datatypeCleanup.js +++ b/src/data/backwardsCompatibility/datatypeCleanup.js @@ -1693,7 +1693,7 @@ globalThis.FacilityDatatypeCleanup = (function() { V.arcade = Math.max(+V.arcade, 0) || 0; V.arcadeUpgradeInjectors = Math.clamp(+V.arcadeUpgradeInjectors, 0, 1) || 0; V.arcadeUpgradeCollectors = Math.clamp(+V.arcadeUpgradeCollectors, 0, 1.5) || 0; - V.arcadeUpgradeFuckdolls = Math.clamp(+V.arcadeUpgradeFuckdolls, 0, 2) || 0; + V.arcadeUpgradeFuckdolls = Math.clamp(+V.arcadeUpgradeFuckdolls, 0, 3) || 0; V.arcadeUpgradeHealth = Math.clamp(+V.arcadeUpgradeHealth, -1, 2) || 0; } diff --git a/src/endWeek/reports/arcadeReport.js b/src/endWeek/reports/arcadeReport.js new file mode 100644 index 0000000000000000000000000000000000000000..4b7455f76a72c7197828b7cbb75f8eba182e8baa --- /dev/null +++ b/src/endWeek/reports/arcadeReport.js @@ -0,0 +1,304 @@ +/** + * @returns {DocumentFragment} + */ +App.EndWeek.arcadeReport = function() { + const el = new DocumentFragment(); + let r; + + const arcadeStats = document.createElement("span"); + el.append(arcadeStats); + + const slaves = App.Utils.sortedEmployees(App.Entity.facilities.arcade); + const slavesLength = slaves.length; + let cockmilked = 0, milked = 0, milkProfits = 0, profits = 0, boobsImplanted = 0, prostatesImplanted = 0, vasectomiesUndone = 0, mSlave, bSlave, pSlave, cSlave, milkResults, growth; + + // Statistics gathering + V.facility = V.facility || {}; + V.facility.arcade = initFacilityStatistics(V.facility.arcade); + const arcadeNameCaps = capFirstChar(V.arcadeName); + + if (slavesLength > 1) { + App.UI.DOM.appendNewElement("p", el, `There are ${slavesLength} inmates confined in ${V.arcadeName}.`, ["bold", "indent"]); + } else { + App.UI.DOM.appendNewElement("p", el, `There is one inmate confined in ${V.arcadeName}.`, ["bold", "indent"]); + } + r = []; + if (V.arcologies[0].FSDegradationist > 20) { + if (V.arcologies[0].FSDegradationistLaw === 1) { + r.push(`The tenants located near the arcade consider the facility a normal part of their surroundings, including the crowd of menial slaves waiting their turn spills out into the hallway, 24 hours a day.`); + } else { + r.push(`The tenants located near the arcade consider the facility a normal part of their surroundings.`); + } + } else if (V.arcologies[0].FSPaternalist > 20) { + r.push(`The tenants located near the arcade consider it an <span class="red">intolerable</span> establishment.`); + } + App.Events.addNode(el, r, "div", "indent"); + if (V.arcadeDecoration !== "standard") { + App.Events.addNode(el, [`${arcadeNameCaps}'s customers enjoy <span class="green">getting off in ${V.arcadeDecoration} surroundings.</span>`], "p", "indent"); + } + + for (const slave of slaves) { + const {He} = getPronouns(slave); + r = []; + /* for the included passages */ + + /* Perform facility based rule changes */ + slave.clothes = "no clothing"; + /* Health */ + if (V.arcadeUpgradeHealth === 2 && slave.health.condition < 40) { + improveCondition(slave, 2); + } else if (slave.health.condition > 20) { + healthDamage(slave, 5); + } else if (V.arcadeUpgradeHealth === 1 && slave.health.condition < -30) { + improveCondition(slave, 2); + } else if (slave.health.condition > -50) { + healthDamage(slave, 3); + } else if (slave.health.condition > -90) { + healthDamage(slave, 1); + } + /* Curatives */ + if (V.arcadeUpgradeHealth === 2) { + slave.curatives = 2; + } else if (V.arcadeUpgradeHealth === 1) { + slave.curatives = 1; + } + /* Stimulation or lack thereof trust/devotion effect */ + if (V.arcadeUpgradeInjectors > 0) { + if (V.arcadeUpgradeInjectors === 2) { + slave.aphrodisiacs = 2; + } + slave.devotion -= 5; + slave.trust -= 10; + } else { + slave.trust -= 5; + } + /* Muscles */ + if (slave.muscles > -100) { + slave.muscles--; + } + + if (V.showEWD !== 0) { + const {He} = getPronouns(slave); + const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); + if (V.seeImages && V.seeReportImages) { + App.UI.DOM.appendNewElement("div", slaveEntry, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]); + } + slaveEntry.append(App.EndWeek.favoriteIcon(slave), " "); + r = []; + r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name")); + if (slave.choosesOwnAssignment === 2) { + r.push(App.SlaveAssignment.choosesOwnJob(slave)); + } else { + r.push(`is confined in ${V.arcadeName}.`); + } + App.Events.addNode(slaveEntry, r, "div"); + + App.Events.addNode( + slaveEntry, + [ + He, + App.SlaveAssignment.workAGloryHole(slave), + ], + "div", + "indented" + ); + } else { + // discard return values silently + App.SlaveAssignment.choosesOwnJob(slave); + App.SlaveAssignment.workAGloryHole(slave); + } + + if (V.arcadeUpgradeCollectors > 0) { + if (slave.vasectomy === 1) { + slave.vasectomy = 0; + vasectomiesUndone++; + cashX(forceNeg(V.surgeryCost), "slaveSurgery", slave); + surgeryDamage(slave, 10); + } else if (slave.lactation < 2) { + slave.lactation = 2; + boobsImplanted++; + bSlave = slave; + cashX(forceNeg(V.surgeryCost), "slaveSurgery", slave); + surgeryDamage(slave, 10); + } else if (slave.prostate === 1) { + slave.prostate = 2; + prostatesImplanted++; + pSlave = slave; + cashX(forceNeg(V.surgeryCost), "slaveSurgery", slave); + surgeryDamage(slave, 10); + } else if (slave.lactation > 0 || slave.balls > 0) { + milkResults = App.SlaveAssignment.getMilked(slave, 1.0); + if (V.showEWD !== 0) { + r.push(App.UI.DOM.makeElement("div", `${He} ${milkResults.text}`, "indent")); + } + milkProfits += milkResults.cash; + growth = 0; + const gigantomastiaMod = slave.geneticQuirks.gigantomastia === 2 ? (slave.geneticQuirks.macromastia === 2 ? 3 : 2) : 1; + if (slave.boobs < 2000) { + growth = 100; + } else if (slave.boobs < 5000 * gigantomastiaMod) { + growth = 50; + } else if (slave.boobs < 10000 * gigantomastiaMod) { + growth = 25; + } + if (slave.geneMods.NCS === 1) { + /* + ** NCS will allow some growth for Arcade milking, but not as much as the Dairy. + */ + growth = Math.trunc(growth / 3.5); + } + slave.boobs += growth; + if ( + (slave.balls > 0) && + (slave.balls < 10) && + (random(1, 100) > (40 + (10 * (slave.balls + (2 * slave.geneMods.NCS))))) + ) { + slave.balls++; + } + if ( + (slave.dick > 0) && + (slave.dick < 10) && + (random(1, 100) > (40 + (10 * slave.dick + (2 * slave.geneMods.NCS)))) + ) { + slave.dick++; + } + if (slave.lactation > 0) { + milked++; + mSlave = slave; + } + if (slave.balls > 0) { + cockmilked++; + cSlave = slave; + } + } + } + if (slave.inflation > 0) { + deflate(slave); + } + if (V.showEWD !== 0) { + r.push(App.SlaveAssignment.standardSlaveReport(slave, false)); + } else { + App.SlaveAssignment.standardSlaveReport(slave, true); + } + App.Events.addNode(el, r, "div", "indent"); + } + + if (slavesLength + V.fuckdolls > 0) { + r = []; + if (milked === 1) { + const {his} = getPronouns(mSlave); + r.push(`One of them is lactating and spends ${his} time in ${V.arcadeName} being simultaneously milked and fucked.`); + } else if (milked > 1) { + r.push(`${capFirstChar(num(milked))} of them are lactating and spend their time in ${V.arcadeName} being simultaneously milked and fucked.`); + } + + if (vasectomiesUndone) { + if (vasectomiesUndone === 1) { + r.push(`One`); + } else { + r.push(capFirstChar(num(vasectomiesUndone))); + } + r.push(`of them had severed vas deferens, so they were reattached to allow sperm through, costing <span class="red">${cashFormat(V.surgeryCost * vasectomiesUndone)}.</span>`); + } + if (boobsImplanted) { + if (boobsImplanted === 1) { + const {he} = getPronouns(bSlave); + r.push(`One of them was not lactating, so ${he} was`); + } else { + r.push(`${capFirstChar(num(boobsImplanted))} of them were not lactating, so they were`); + } + r.push(`implanted with long-acting lactation inducing drugs, costing <span class="red">${cashFormat(V.surgeryCost * boobsImplanted)}.</span>`); + } + if (prostatesImplanted) { + if (prostatesImplanted === 1) { + const {he} = getPronouns(pSlave); + r.push(`One of them was not producing the maximum possible amount of precum, so ${he} was`); + } else { + r.push(`${capFirstChar(num(prostatesImplanted))} of them were not producing the maximum possible amount of precum, so they were`); + } + r.push(`implanted with long-acting prostate stimulation drugs, costing <span class="red">${cashFormat(V.surgeryCost * prostatesImplanted)}.</span>`); + } + if (cockmilked === 1) { + const {he} = getPronouns(cSlave); + r.push(`One of them retains testicles and is brutally cockmilked as ${he} is used.`); + } else if (cockmilked > 1) { + r.push(`${capFirstChar(num(cockmilked))} of them retain testicles and are brutally cockmilked as they are used.`); + } + + r.push(`The arcade makes you`); + if (V.policies.publicFuckdolls === 0) { + r.push(`<span class="yellowgreen">${cashFormat(profits)}</span> from selling the inmates' holes`); + } else { + r.push(`<span class="green">more reputable</span> from freely providing the inmates' holes`); + } + if (V.arcadeUpgradeCollectors > 0 && V.policies.publicFuckdolls === 0) { + r.push(`and`); + } + if (V.arcadeUpgradeCollectors > 0) { + r.push(`<span class="yellowgreen">${cashFormat(milkProfits)}</span> from selling the fluids they produced`); + } + r.push(`this week.`); + if (V.arcologies[0].FSPaternalist > 20) { + repX(forceNeg(Math.trunc(profits / 20)), "arcade"); + } + App.Events.addNode(el, r, "div", "indent"); + } + + if (V.arcadeUpgradeFuckdolls > 1) { + const fuckdolls = slaves.filter(s => fuckdollQualifier(s)); + if (fuckdolls.length > 0) { + // ascending sort by sexAmount...least popular slaves are converted first + fuckdolls.sort((a, b) => b.sexAmount - a.sexAmount); + for (const fuckdoll of fuckdolls) { + const {he} = getPronouns(fuckdoll); + App.UI.DOM.appendNewElement("div", el, `${fuckdoll.slaveName} is low-quality merchandise, so ${he} has been converted into a Fuckdoll.`, "indent"); + removeSlave(fuckdoll); + V.fuckdolls++; + if (V.arcadeUpgradeFuckdolls === 2) { + break; // convert at most one per week on this setting + } + } + } else { + App.UI.DOM.appendNewElement("div", el, `No slaves have failed quality inspection for Fuckdoll conversion. ${arcadeNameCaps} will remain overcrowded this week.`, "indent"); + } + } + + if (slavesLength > 0) { + // Record statistics gathering + let b = V.facility.arcade; + b.whoreIncome = 0; + b.customers = 0; + b.whoreCosts = 0; + b.rep = 0; + for (let si of b.income.values()) { + b.whoreIncome += si.income; + b.customers += si.customers; + b.whoreCosts += si.cost; + b.rep += si.rep; + } + b.maintenance = V.arcade * V.facilityCost * (0.05 + 0.02 * V.arcadeUpgradeInjectors + 0.05 * V.arcadeUpgradeCollectors); + b.totalIncome = b.whoreIncome; + b.totalExpenses = b.whoreCosts + b.maintenance; + b.profit = b.totalIncome - b.totalExpenses; + + + // Arcade stats + el.append(App.Facilities.Arcade.Stats(false)); + arcadeStats.append(App.Facilities.Arcade.Stats(true)); + } + return el; + + /** + * + * @param {App.Entity.SlaveState} slave + */ + function fuckdollQualifier(slave) { + if (slave.sentence === 0 && slave.fuckdoll === 0 && slave.fetish === "mindbroken") { + if (slave.physicalAge > 35) { + return true; + } else if (slave.vagina >= 4 || slave.anus >= 4) { + return true; + } + } + } +}; diff --git a/src/endWeek/reports/cellblockReport.js b/src/endWeek/reports/cellblockReport.js new file mode 100644 index 0000000000000000000000000000000000000000..4411600773899e36146c69c6abeea6e3655c900c --- /dev/null +++ b/src/endWeek/reports/cellblockReport.js @@ -0,0 +1,345 @@ +/** + * @returns {DocumentFragment} + */ +App.EndWeek.cellblockReport = function() { + const el = new DocumentFragment(); + let r; + + const slaves = App.Utils.sortedEmployees(App.Entity.facilities.cellblock); + let brokenSlaves = 0, idleBonus = 0, softenedQuirks = 0, trustMalus = 0, FLsFetish = 0; + let devBonus = (V.cellblockDecoration !== "standard") ? 1 : 0; + + const cellblockNameCaps = capFirstChar(V.cellblockName); + V.flSex = App.EndWeek.getFLSex(App.Entity.facilities.cellblock);/* FIXME: should be local, passed as a parameter to saRules */ + + if (S.Wardeness) { + const { + He, His, + he, his, him, wife + } = getPronouns(S.Wardeness); + r = []; + + if (S.Wardeness.health.condition < -80) { + improveCondition(S.Wardeness, 20); + } else if (S.Wardeness.health.condition < -40) { + improveCondition(S.Wardeness, 15); + } else if (S.Wardeness.health.condition < 0) { + improveCondition(S.Wardeness, 10); + } else if (S.Wardeness.health.condition < 90) { + improveCondition(S.Wardeness, 7); + } + if (S.Wardeness.devotion <= 60) { + S.Wardeness.devotion += 2; + } + S.Wardeness.devotion += devBonus; + if (S.Wardeness.trust < 60) { + S.Wardeness.trust += 3; + } + if (S.Wardeness.rules.living !== "luxurious") { + S.Wardeness.rules.living = "luxurious"; + } + if (S.Wardeness.rules.rest !== "restrictive") { + S.Wardeness.rules.rest = "restrictive"; + } + if (S.Wardeness.fetishStrength <= 95) { + if (S.Wardeness.fetish !== "sadist") { + if (fetishChangeChance(S.Wardeness) > random(0, 100)) { + FLsFetish = 1; + S.Wardeness.fetishKnown = 1; + S.Wardeness.fetish = "sadist"; + } + } else if (S.Wardeness.fetishKnown === 0) { + FLsFetish = 1; + S.Wardeness.fetishKnown = 1; + } else { + FLsFetish = 2; + S.Wardeness.fetishStrength += 4; + } + } + if (S.Wardeness.energy > 95 || S.Wardeness.fetish === "sadist") { + devBonus++; + trustMalus++; + idleBonus++; + } + r.push(`${SlaveFullName(S.Wardeness)} is serving as the Wardeness.`); + if (S.Wardeness.relationship === -3 && S.Wardeness.devotion > 50) { + devBonus++; + trustMalus++; + idleBonus++; + r.push(`As your ${wife}, ${he} tries ${his} best to break the disobedient slaves to your will.`); + } + if (FLsFetish === 1) { + r.push(`One day ${he} demands obedience. The next day ${he} strikes a slave when it isn't given. The next, ${he} seems more excited than embarrassed when beating a prisoner. Soon, ${he}'s looking for an excuse to punish. ${He}'s <span class="pink">become more of a sadist.</span>`); + } else if (FLsFetish === 2) { + r.push(`Being not only allowed but encouraged to get off while punishing prisoners <span class="lightsalmon">deepens ${his} sadism.</span>`); + } + if (setup.wardenessCareers.includes(S.Wardeness.career)) { + devBonus++; + trustMalus++; + idleBonus++; + r.push(`${He} has experience with detecting security issues and grinding down potential miscreants from ${his} life before ${he} was a slave, making ${him} more effective.`); + } else if (S.Wardeness.skill.wardeness >= V.masteredXP) { + devBonus++; + trustMalus++; + idleBonus++; + r.push(`${He} has experience with detecting security issues and grinding down potential miscreants from working for you, making ${him} more effective.`); + } else { + S.Wardeness.skill.wardeness += random(1, Math.ceil((S.Wardeness.intelligence + S.Wardeness.intelligenceImplant) / 15) + 8); + } + if (S.Wardeness.fetish === "sadist") { + r.push(`${He} uses the prisoners to gratify ${his} sadism, terrifying them and quickly breaking their resistance.`); + } else if (S.Wardeness.energy > 95) { + r.push(`${He} is so sexually depraved that ${he} constantly molests the prisoners, breaking them to a life of servitude.`); + } + if (S.Wardeness.sexualFlaw === "malicious" || S.Wardeness.sexualFlaw === "abusive") { + devBonus++; + trustMalus += 2; + idleBonus += 2; + r.push(`Sexual abuse of prisoners has become an end for ${him}, not a means. ${He} inspires ${his} prisoners to do everything possible to qualify to get away from ${him}, even as ${he} slowly grinds away their interest in sex to do it.`); + } else if (S.Wardeness.sexualQuirk === "caring") { + devBonus--; + trustMalus--; + idleBonus--; + r.push(`${His} kindness sometimes shows through ${his} tough facade, letting prisoners get off easier than they should.`); + } + if (S.Wardeness.dick > 2 && canPenetrate(S.Wardeness)) { + devBonus++; + trustMalus++; + idleBonus++; + r.push(`${His} molestation of the prisoners is more varied and effective because ${he} has a dick to fuck them with.`); + } + if (S.Wardeness.muscles > 35) { + devBonus++; + trustMalus++; + idleBonus++; + r.push(`${He} is strong enough to restrain anyone that tries anything with ${his} own hands.`); + } + if (S.Wardeness.devotion > 95) { + devBonus++; + trustMalus++; + idleBonus++; + r.push(`${His} devotion to you is so absolute that ${he} sees breaking bitches for your service as a noble calling.`); + } + App.Events.addNode(el, r, "div", "indent"); + for (const slave of slaves) { + r = []; + if (S.Wardeness.rivalryTarget === slave.ID) { + r.push(`${He} greatly enjoys breaking ${his} ${rivalryTerm(S.Wardeness)}, ${slave.slaveName}'s will.`); + slave.devotion++; + slave.trust -= 3; + if (random(1, 100) > 30) { + S.Wardeness.rivalry++; + slave.rivalry++; + } + } else if (S.Wardeness.relationshipTarget === slave.ID) { + r.push(`${He} hates having to break ${his} ${relationshipTerm(S.Wardeness)}, ${slave.slaveName}, but ${his} devotion to you wins out in the end.`); + slave.devotion++; + slave.trust -= 3; + if (random(1, 100) >= 50) { + r.push(`${His} and ${slave.slaveName}'s relationship has been shattered by these events.`); + S.Wardeness.relationship = 0; + S.Wardeness.relationshipTarget = 0; + slave.relationship = 0; + slave.relationshipTarget = 0; + } + } else if (areRelated(S.Wardeness, slave)) { + const {he2, his2} = getPronouns(slave).appendSuffix("2"); + r.push(`${He} shows ${his} ${relativeTerm(S.Wardeness, slave)} ${slave.slaveName} no mercy, making sure ${he2} understands ${his2} place.`); + slave.devotion++; + slave.trust--; + } + App.Events.addNode(el, r, "div", "indent"); + } + if (slaves.length < V.cellblock && !slaveResting(S.Wardeness)) { + const seed = random(1, 10) + ((V.cellblock - slaves.length) * (random(150, 170) + (idleBonus * 10))); + cashX(seed, "cellblock", S.Wardeness); + App.Events.addNode(el, [`Since ${he} doesn't have enough prisoners to manage to keep ${him} busy, ${he} works on citizens' slaves, earning <span class="yellowgreen"> ${cashFormat(seed)}.</span>`], "div", "indent"); + } + } + + if (slaves.length > 0) { + if (slaves.length === 1) { + App.UI.DOM.appendNewElement("div", el, `One slave is being confined in ${V.cellblockName} until they are willing to obey.`, "indent"); + } else { + App.UI.DOM.appendNewElement("div", el, `${slaves.length} slaves are being confined in ${V.cellblockName} until they are willing to obey.`, "indent"); + } + } + + + if (S.Wardeness) { + const slave = S.Wardeness; + /* apply following SA passages to facility leader */ + if (V.showEWD !== 0) { + const wardenessEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); + if (V.seeImages && V.seeReportImages) { + App.UI.DOM.appendNewElement("div", wardenessEntry, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]); + } + wardenessEntry.append(App.EndWeek.favoriteIcon(slave), " "); + App.Events.addNode( + wardenessEntry, + [ + App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name"), + `is serving as the Wardeness in ${V.cellblockName}`, + App.SlaveAssignment.standardSlaveReport(slave, false), + ] + ); + } else { + App.SlaveAssignment.standardSlaveReport(slave, true); + } + } + + for (const slave of slaves) { + const {He} = getPronouns(slave); + if (slave.devotion <= 20) { + if (slave.trust >= -20) { + if ( + (slave.hears === -1 && slave.earwear !== "hearing aids") || + (slave.hears === 0 && slave.earwear === "muffling ear plugs") || + (slave.hears === -2) + ) { + slave.devotion -= 2; + slave.trust -= 2; + } else { + slave.devotion -= 4; + slave.trust -= 4; + } + } else { + slave.devotion++; + } + } + switch (V.cellblockDecoration) { + case "Paternalist": + slave.rules.living = "normal"; + if (slave.inflation > 0) { + deflate(slave); + } + break; + case "Pastoralist": + slave.rules.living = "spare"; + if (slave.inflation === 0) { + if (slave.pregKnown === 0 && slave.bellyImplant < 1500) { + slave.inflation = 2; + slave.inflationType = "milk"; + slave.inflationMethod = 1; + } else { + slave.inflation = 1; + slave.inflationType = "milk"; + slave.inflationMethod = 1; + } + SetBellySize(slave); + } + break; + case "Hedonistic": + slave.rules.living = "spare"; + if (slave.weight < 200) { + if (slave.weightDirection === 1) { + slave.weight += 5; + } else if (slave.weightDirection === -1) { + slave.weight += 1; + } else { + slave.weight += 3; + } + } + if (slave.muscles > -100) { + slave.muscles -= 2; + } + if (slave.inflation === 0) { + if (slave.pregKnown === 0 && slave.bellyImplant < 1500) { + slave.inflation = 3; + slave.inflationType = "food"; + slave.inflationMethod = 1; + } else { + slave.inflation = 1; + slave.inflationType = "food"; + slave.inflationMethod = 1; + } + SetBellySize(slave); + } + break; + default: + slave.rules.living = "spare"; + if (slave.inflation > 0) { + deflate(slave); + } + } + if (V.cellblockUpgrade === 1) { + if (slave.behavioralFlaw !== "none" && slave.behavioralQuirk === "none") { + SoftenBehavioralFlaw(slave); + slave.devotion -= 10; + softenedQuirks++; + } else if (slave.sexualFlaw !== "none" && slave.sexualQuirk === "none") { + SoftenSexualFlaw(slave); + slave.devotion -= 10; + softenedQuirks++; + } + } + slave.devotion += devBonus; + slave.trust -= trustMalus; + if (S.Wardeness && S.Wardeness.sexualFlaw === "malicious" && slave.energy >= 2) { + slave.energy -= 2; + } + if (slave.health.condition < -80) { + improveCondition(slave, 20); + } else if (slave.health.condition < -40) { + improveCondition(slave, 15); + } else if (slave.health.condition < 0) { + improveCondition(slave, 10); + } else if (slave.health.condition < 40) { + improveCondition(slave, 7); + } else if (slave.health.condition < 100) { + improveCondition(slave, 3); + } + + if (V.showEWD !== 0) { + const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); + if (V.seeImages && V.seeReportImages) { + App.UI.DOM.appendNewElement("div", slaveEntry, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]); + } + slaveEntry.append(App.EndWeek.favoriteIcon(slave), " "); + r = []; + r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name")); + if (slave.choosesOwnAssignment === 2) { + r.push(`${App.SlaveAssignment.choosesOwnJob(slave)}`); + } else { + r.push(`is confined in ${V.cellblockName}.`); + } + App.Events.addNode(slaveEntry, r, "div"); + + r = []; + r.push(He); + r.push(App.SlaveAssignment.stayConfined(slave)); + r.push(App.SlaveAssignment.standardSlaveReport(slave, false)); + App.Events.addNode(slaveEntry, r, "div", "indent"); + } else { + // discard return values silently + App.SlaveAssignment.choosesOwnJob(slave); + App.SlaveAssignment.stayConfined(slave); + App.SlaveAssignment.standardSlaveReport(slave, true); + } + } + if (softenedQuirks || brokenSlaves) { + r = []; + if (softenedQuirks > 0) { + r.push(`${cellblockNameCaps}'s advanced compliance systems successfully softened`); + if (softenedQuirks === 1) { + r.push(`one slave's mental flaw into an <span class="green">appealing quirk,</span> though the constant correction caused them <span class="mediumorchid">considerable anguish.</span>`); + } else { + r.push(`${softenedQuirks} slaves' mental flaws into <span class="green">appealing quirks,</span> though the constant correction caused them <span class="mediumorchid">considerable anguish.</span>`); + } + } + if (brokenSlaves > 0) { + if (brokenSlaves === 1) { + r.push(`One slave is now willing to <span class="hotpink">do as they're told</span> and has been released.`); + } else { + r.push(`${brokenSlaves} slaves are now willing to <span class="hotpink">do as they're told</span> and have been released.`); + } + if (V.cellblockDecoration !== "standard") { + App.Events.addNode(el, r, "p", "indent"); + r = []; + r.push(`${cellblockNameCaps}'s ${V.cellblockDecoration} atmosphere <span class="hotpink">had an impact on them while they were</span> imprisoned.`); + } + } + App.Events.addNode(el, r, "p", "indent"); + } + return el; +}; diff --git a/src/endWeek/reports/clubReport.js b/src/endWeek/reports/clubReport.js index de98b3b10aa2a49b8c96c8edccb3b48456b25b6d..9f43989a3e6505c5a6476491c91ebc4da4903766 100644 --- a/src/endWeek/reports/clubReport.js +++ b/src/endWeek/reports/clubReport.js @@ -4,12 +4,9 @@ App.EndWeek.clubReport = function() { const el = new DocumentFragment(); let r; - let he, him, his, He, His, wife, himself; const slaves = App.Utils.sortedEmployees(App.Entity.facilities.club); - const DL = slaves.length; V.legendaryEntertainerID = 0; - let FLsFetish = 0; V.legendaryWombID = 0; // Statistics gathering; income is rep boosts in numbers, and profit will be rep per cash unit, or cash unit per rep @@ -19,6 +16,7 @@ App.EndWeek.clubReport = function() { el.append(clubStats); if (S.DJ) { + let FLsFetish = 0; r = []; if (S.DJ.health.condition < -80) { improveCondition(S.DJ, 20); @@ -58,16 +56,16 @@ App.EndWeek.clubReport = function() { } /* Make sure we have registered living expenses as for any other slave */ getSlaveStatisticData(S.DJ, V.facility.club); - ({ - he, him, his, He, His, wife - } = getPronouns(S.DJ)); + const { + he, him, his, He, His, wife, himself + } = getPronouns(S.DJ); r.push(`${SlaveFullName(S.DJ)} is performing as the DJ.`); if (S.DJ.relationship === -3 && S.DJ.devotion > 50) { r.push(`${He} tries ${his} best to be your energetic, cheerful ${wife}.`); } if (FLsFetish === 1) { r.push(`${He}'s expected to be the innovative, beautiful DJ spinning beats one minute, and come out of ${his} booth to grind on the floor the next; ${he} enjoys the interplay, and finds greater <span class="lightcoral">pleasure in exhibitionism.</span>`); - } else if ((FLsFetish === 2)) { + } else if (FLsFetish === 2) { r.push(`Every day ${he} gets to enjoy hundreds of stares on ${his} skin, and <span class="lightsalmon">becomes more of an exhibitionist.</span>`); } if (getBestVision(S.DJ) === 0) { @@ -101,7 +99,7 @@ App.EndWeek.clubReport = function() { S.DJ.skill.DJ += random(1, Math.ceil((S.DJ.intelligence + S.DJ.intelligenceImplant) / 15) + 8); } App.Events.addNode(el, r, "p", "indent"); - if (DL + V.clubSlavesGettingHelp < 10 && V.DJnoSex !== 1 && !slaveResting(S.DJ)) { + if (slaves.length + V.clubSlavesGettingHelp < 10 && V.DJnoSex !== 1 && !slaveResting(S.DJ)) { if (V.legendaryEntertainerID === 0 && S.DJ.prestige === 0 && S.DJ.skill.entertainment >= 100 && S.DJ.devotion > 50) { V.legendaryEntertainerID = S.DJ.ID; } @@ -127,10 +125,10 @@ App.EndWeek.clubReport = function() { } } - if (DL > 0) { + if (slaves.length > 0) { r = []; - if (DL !== 1) { - r.push(App.UI.DOM.makeElement("span", `The ${DL} slaves pleasing citizens in ${V.clubName}`, "bold")); + if (slaves.length !== 1) { + r.push(App.UI.DOM.makeElement("span", `The ${slaves.length} slaves pleasing citizens in ${V.clubName}`, "bold")); } else { r.push(App.UI.DOM.makeElement("span", `The one slave pleasing citizens in ${V.clubName}`, "bold")); } @@ -160,11 +158,8 @@ App.EndWeek.clubReport = function() { } } - if (DL > 0) { + if (slaves.length > 0) { for (const slave of slaves) { - ({ - he, him, his, He, His, wife - } = getPronouns(slave)); if (V.legendaryEntertainerID === 0 && slave.prestige === 0 && slave.skill.entertainment >= 100 && slave.devotion > 50) { V.legendaryEntertainerID = slave.ID; } @@ -213,6 +208,7 @@ App.EndWeek.clubReport = function() { } App.Events.addNode(slaveEntry, r, "div"); + const {He} = getPronouns(slave); App.Events.addNode( slaveEntry, [ @@ -234,7 +230,7 @@ App.EndWeek.clubReport = function() { App.Events.addNode(el, [App.Ads.report("club")], "p", "indented"); // Record statistics gathering - const b = State.variables.facility.club; + const b = V.facility.club; b.whoreIncome = 0; b.customers = 0; b.whoreCosts = 0; @@ -245,8 +241,8 @@ App.EndWeek.clubReport = function() { b.whoreCosts += si.cost; b.rep += si.rep; } - b.adsCosts = State.variables.clubAdsSpending; - b.maintenance = State.variables.club * State.variables.facilityCost * (1.0 + 0.2 * State.variables.clubUpgradePDAs); + b.adsCosts = V.clubAdsSpending; + b.maintenance = V.club * V.facilityCost * (1.0 + 0.2 * V.clubUpgradePDAs); b.totalIncome = b.whoreIncome + b.adsIncome; b.totalExpenses = b.whoreCosts + b.adsCosts + b.maintenance; b.profit = b.totalIncome / b.totalExpenses; diff --git a/src/endWeek/reports/penthouseReport.js b/src/endWeek/reports/penthouseReport.js new file mode 100644 index 0000000000000000000000000000000000000000..776b0e6cf67bd4a21d324de2cb12a13826c923ff --- /dev/null +++ b/src/endWeek/reports/penthouseReport.js @@ -0,0 +1,684 @@ +App.EndWeek.penthouseReport = function() { + const el = document.createElement("p"); + let r; + + const HGSuiteSlaves = App.Utils.jobForAssignment(Job.HEADGIRLSUITE).employees(); + const HGTrainSlavesIDs = slavesToTrain(); + + for (const slave of V.slaves) { + if (assignmentVisible(slave)) { + r = []; + const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); + if (V.seeImages && V.seeReportImages) { + App.UI.DOM.appendNewElement("div", slaveEntry, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]); + } + slaveEntry.append(App.EndWeek.favoriteIcon(slave), " "); + r.push(fullReport(slave)); + App.Events.addNode(el, r, "p"); + + if (slave.ID === V.HeadGirlID && HGSuiteSlaves.length > 0) { + /* We found the Head Girl, now let's find her slave */ + const hgSlave = getSlave(HGSuiteSlaves[0].ID); + const {He2, he2} = getPronouns(hgSlave).appendSuffix("2"); + r = []; + if (hgSlave.assignment !== "live with your Head Girl") { + r.push(`<span class="red">${hgSlave.slaveName} had been assigned to live with your Head Girl, but this week ${he2} was assigned to ${hgSlave.assignment}. ${He2} has been released to your penthouse for reassignment.</span>`); + removeJob(hgSlave, "live with your Head Girl"); + } else { + r.push(App.UI.DOM.makeElement("span", SlaveFullName(hgSlave), "slave-name")); + if (hgSlave.choosesOwnAssignment === 2) { + r.push(App.SlaveAssignment.choosesOwnJob(hgSlave)); + r.push(He2); + } + r.push(App.SlaveAssignment.liveWithHG(hgSlave)); + } + App.Events.addNode(el, r, "p"); + } + } + } + + /* count open spots in facilities after all assignments have been decided for the week */ + V.brothelSpots = App.Entity.facilities.brothel.freeSpace; + V.clubSpots = App.Entity.facilities.club.freeSpace; + V.dairySpots = App.Entity.facilities.dairy.freeSpace; + V.servantsQuartersSpots = App.Entity.facilities.servantsQuarters.freeSpace; + + return el; + + /** + * @param {App.Entity.SlaveState} slave + */ + function fullReport(slave) { + const el = new DocumentFragment(); + const { + He, His, + he, him + } = getPronouns(slave); + let r = []; + let milkResults; + let milkResult; + + r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name")); + if (slave.choosesOwnAssignment === 2) { + r.push(App.SlaveAssignment.choosesOwnJob(slave)); + r.push(He); + } + + switch (slave.assignment) { + case "rest": + r.push(App.SlaveAssignment.rest(slave)); + break; + case "whore": + r.push(App.SlaveAssignment.whore(slave)); + break; + case "serve the public": + r.push(App.SlaveAssignment.serveThePublic(slave)); + break; + case "work a glory hole": + r.push(App.SlaveAssignment.workAGloryHole(slave)); + break; + case "get milked": + milkResults = App.SlaveAssignment.getMilked(slave); + r.push(milkResults.text); + break; + case "take classes": + r.push(App.SlaveAssignment.takeClasses(slave)); + break; + case "please you": + r.push(App.SlaveAssignment.pleaseYou(slave)); + break; + case "be a subordinate slave": + r.push(App.SlaveAssignment.serveYourOtherSlaves(slave)); + break; + case "be a servant": + r.push(App.SlaveAssignment.servant(slave)); + break; + case "stay confined": + r.push(App.SlaveAssignment.stayConfined(slave)); + break; + case "guard you": + r.push(App.SlaveAssignment.guardYou(slave)); + break; + case "be your Head Girl": + r.push(App.SlaveAssignment.beYourHeadGirl(slave)); + break; + case "recruit girls": + r.push(App.SlaveAssignment.recruitGirls(slave)); + break; + default: + removeJob(slave, slave.assignment); + r.push(App.SlaveAssignment.rest(slave)); + } + + if (V.servantMilkers === 1 && slave.lactation > 0 && slave.assignment !== "get milked") { + r.push(`${His} assignment`); + if (App.Data.misc.servantMilkersJobs.includes(slave.assignment)) { + r.push(`is not strenuous, so ${he}`); + if (slave.devotion > 20) { + if (slave.fetish === "boobs") { + r.push(`eagerly`); + } + r.push(`uses`); + } else if (slave.devotion >= -20) { + r.push(`is required to use`); + } else { + r.push(`is forced to use`); + } + r.push(`the penthouse milkers frequently,`); + milkResult = App.SlaveAssignment.getMilked(slave, 0.5); + } else { + r.push(`keeps ${him} busy, but ${he}`); + if (slave.devotion > 20) { + if (slave.fetish === "boobs") { + r.push(`eagerly`); + } + r.push(`uses`); + } else if (slave.devotion >= -20) { + r.push(`is required to use`); + } else { + r.push(`is forced to use`); + } + r.push(`the penthouse milkers whenever ${he} can,`); + milkResult = App.SlaveAssignment.getMilked(slave, 0.25); + } + r.push(`and ${he} gives ${milkResult.milk} liters of milk over the week, which is sold for <span class="yellowgreen">${cashFormat(milkResult.milkSale)}.</span>`); + } + + App.Events.addNode(el, r, "div"); + r = []; + if (slave.minorInjury !== 0) { + r.push(`${His} ${slave.minorInjury} will heal by the end of the week.`); + } + + if (V.showEWD !== 0) { + r.push(App.SlaveAssignment.standardSlaveReport(slave, false)); + } else { + // discard return values silently + App.SlaveAssignment.standardSlaveReport(slave, true); + } + + if (V.PC.health.shortDamage < 30 && Array.isArray(V.personalAttention) && V.personalAttention.findIndex(function(s) { return s.ID === slave.ID; }) !== -1) { + r.push(personalAttention(slave)); + } + + if (HGTrainSlavesIDs.length > 0) { + const trainee = HGTrainSlavesIDs.find(trainee => slave.ID === trainee.ID); + if (trainee) { + r.push(HGApplication(slave, trainee.training)); + } + } + + r.push(App.SlaveAssignment.devotion(slave)); + App.Events.addNode(el, r); + return el; + } + + /** + * @param {App.Entity.SlaveState} slave + * @param {string} headGirlsTraining + */ + function HGApplication(slave, headGirlsTraining) { + const el = document.createElement("span"); + const { + He, His, + he, his, him, himself, girl + } = getPronouns(S.HeadGirl); + const {he2, his2, him2, himself2, girl2} = getPronouns(slave).appendSuffix("2"); + let r = []; + + slave.training = Math.clamp(slave.training, 0, 150); + let effectiveness = S.HeadGirl.actualAge + ((S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant) / 3) - (S.HeadGirl.accent * 5) + (V.HGSeverity * 10) + ((slave.intelligence + slave.intelligenceImplant) / 4) - (slave.accent * 5); + if (V.AgePenalty === 0) { + effectiveness += Math.max(0, (30 - S.HeadGirl.actualAge)); + } + if (S.HeadGirl.sexualFlaw === "abusive" && V.HGSeverity >= 0) { + effectiveness += 10; + } + if (headGirlsTraining !== "health") { + slave.health.tired += 25; + } + + r.push(`<span style="font-weight: bold">Your Head Girl</span> <span class='slave-name'>${S.HeadGirl.slaveName}</span> notices that <span class='slave-name'>${slave.slaveName}</span>`); + switch (headGirlsTraining) { + case "health": + r.push(`is unwell.`); + break; + case "obedience": + r.push(`is disobedient.`); + break; + case "paraphilia": + r.push(`has a paraphilia.`); + break; + case "flaw": + r.push(`has an unpleasant flaw worth fixing.`); + break; + case "soften": + r.push(`has an unpleasant flaw that ${he} can try to soften into a unique quirk.`); + break; + case "oral skill": + r.push(`isn't as orally skilled as ${he} is.`); + break; + case "anal skill": + r.push(`isn't as skilled at taking anal as ${he} is.`); + break; + case "fuck skill": + r.push(`isn't as skilled at vaginal intercourse as ${he} is.`); + break; + case "whore skill": + r.push(`isn't as skilled at the fine art of sex for money as ${he} is.`); + break; + case "entertain skill": + r.push(`isn't as skilled at entertainment as ${he} is.`); + } + + if (headGirlsTraining === "health") { + r.push(`${He} helps ${slave.slaveName} however ${he} can. The tender care has <span class="green">improved ${slave.slaveName}'s health.</span>`); + improveCondition(slave, 10); + slave.health.tired = Math.clamp(slave.health.tired - 10, 0, 1000); + slave.training = 0; + } else { + if (S.HeadGirl.career === "an arcology owner") { + r.push(`${He} was once an arcology owner ${himself}, making ${him} truly peerless as a Head Girl.`); + effectiveness += 50; + } else if (setup.HGCareers.includes(S.HeadGirl.career)) { + r.push(`${He} was used to giving commands and being obeyed in ${his} life before ${he} was a slave, experience ${he} can call on now.`); + effectiveness += 5; + } else if (S.HeadGirl.skill.headGirl >= V.masteredXP) { + r.push(`${He} is used to giving commands and being obeyed through experience, rendering ${him} more effective.`); + effectiveness += 5; + } + + if (S.HeadGirl.actualAge > 30) { + r.push(`${His} age and experience help ${him} as ${he} works with ${slave.slaveName}.`); + } else if (S.HeadGirl.actualAge < 25 && V.AgePenalty > 0) { + r.push(`${His} youth and inexperience impede ${him} as ${he} works with ${slave.slaveName}.`); + } + + if (S.HeadGirl.accent >= 3) { + r.push(`${He} does ${his} best to give orders in ${V.language}, but has to resort to a lot of unseemly gesticulation and shouting, making ${him} much less effective.`); + } else if (S.HeadGirl.accent === 2) { + r.push(`${His} heavy ${aNational(S.HeadGirl.nationality)} accent impedes ${his} clarity in ${V.language}, making ${him} somewhat less effective.`); + } + + if (headGirlsTraining === "obedience" || headGirlsTraining === "flaw" || headGirlsTraining === "soften") { + if (S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant > 50) { + if (slave.intelligence + slave.intelligenceImplant > 50) { + r.push(`${He} needs ${his} wits about ${him} to mold ${slave.slaveName}, who's quite intelligent ${himself2}.`); + } else if (slave.intelligence + slave.intelligenceImplant >= -50) { + r.push(`${His} intelligence helps ${him} mold ${slave.slaveName}.`); + } else { + r.push(`Molding ${slave.slaveName} is very easy, especially for a smart Head Girl like ${him}.`); + } + } + } else { + if (S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant > 50) { + if (slave.intelligence + slave.intelligenceImplant > 50) { + r.push(`Both slaves are quite intelligent, making ${his} job much easier.`); + } else if (slave.intelligence + slave.intelligenceImplant >= -50) { + r.push(`${He}'s quite intelligent and can teach ${slave.slaveName} well.`); + } else { + r.push(`${He} needs all ${his} considerable intelligence to get through to the idiot ${he} has to teach.`); + } + } + } + + if (V.HGSeverity > 0) { + r.push(`Your directives encourage ${him} to rape any slave that fails in the slightest way, a task ${he} approaches`); + if (S.HeadGirl.sexualFlaw === "abusive") { + r.push(`eagerly, since ${he} prefers to take ${his} pleasure without consent.`); + } else if (S.HeadGirl.fetish === "sadist") { + r.push(`with sadistic enthusiasm.`); + } else if (S.HeadGirl.fetish === "dom") { + r.push(`with confidence.`); + } else if (S.HeadGirl.energy > 95) { + r.push(`as a convenient way to`); + if (S.HeadGirl.balls > 0) { + r.push(`drain ${his} perpetually overfilled balls into a series of spasming holes.`); + } else { + r.push(`sate ${his} excess sexual appetite.`); + } + } else { + r.push(`dutifully.`); + } + if (slave.vagina === 0) { + r.push(`In ${slave.slaveName}'s case, ${he}'s careful to limit ${his2} sexual abuse to things that won't take the ${girl2}'s virginity. The slave`); + } else if (slave.anus === 0) { + r.push(`${He}'s careful to molest ${slave.slaveName} in ways that don't involve penetrating ${his2} virgin ass. The slave`); + } else { + r.push(`${slave.slaveName}`); + } + if (slave.devotion > 50) { + r.push(`accepts the abuse, believing ${he2} deserves to be raped.`); + } else if (slave.devotion >= -20) { + r.push(`is <span class="gold">frightened</span> by the unceasing abuse.`); + slave.trust -= 1; + } else { + r.push(`<span class="mediumorchid">hates</span> and <span class="gold">fears</span> the constant abuse.`); + slave.trust -= 1; + slave.devotion -= 1; + } + r.push(`${S.HeadGirl.slaveName} makes sure ${his} victim hates it, every time, and ${slave.slaveName} can't help but do ${his2} very best to avoid this treatment.`); + } else if (V.HGSeverity === 0) { + r.push(`You allow ${him} to use ${his} own judgment when punishing failures,`); + if (S.HeadGirl.sexualFlaw === "abusive") { + r.push(`and ${he} usually decides in favor of forcing misbehaving slaves to get ${him} off.`); + } else if (S.HeadGirl.fetish === "sadist") { + r.push(`permission the sadist uses for ${his} own gratification.`); + } else if (S.HeadGirl.fetish === "dom") { + r.push(`which the dominant ${girl} uses confidently.`); + } else if (S.HeadGirl.energy > 95) { + r.push(`which ${he} uses to`); + if (S.HeadGirl.balls > 0) { + r.push(`force ${his} subordinates to keep ${his} balls drained.`); + } else { + r.push(`extract the constant sexual favors ${his} libido demands.`); + } + } else { + r.push(`and ${he} does ${his} best to be fair.`); + } + r.push(`${slave.slaveName}`); + if (slave.devotion > 50) { + r.push(`is <span class="mediumaquamarine">grateful</span> that ${he2} is punished justly when ${he2} makes mistakes.`); + slave.trust += 1; + } else if (slave.devotion >= -20) { + r.push(`does ${his2} best to learn quickly and avoid punishment.`); + } else { + r.push(`is <span class="gold">scared</span> by ${his2} inability to get away with the smallest disobedience.`); + slave.trust -= 1; + } + } else { + r.push(`You require ${him} to use respect when punishing; ${he} does ${his} best to motivate, but is unable to use real fear as a tool. ${slave.slaveName} understands this, and <span class="mediumaquamarine">trusts</span> that if ${he2} fails, the consequences won't be too awful.`); + slave.trust += 1; + } + + if (headGirlsTraining === "obedience") { + slave.training = 0; + effectiveness -= (slave.intelligence + slave.intelligenceImplant) / 3; + if (effectiveness <= 0) { + r.push(`${slave.slaveName} is smart enough to complicate things; ${he2} manages to outwit ${him} this week and makes no progress.`); + } else { + slave.devotion += Math.ceil(effectiveness / 4); + if (slave.devotion < -50) { + r.push(`${He} helps watch and restrain the rebellious ${slave.slaveName}, helping wear ${him2} down, <span class="gold">breaking ${slave.slaveName}'s rebelliousness.</span>`); + } else if (slave.devotion < -20) { + r.push(`${He} keeps ${slave.slaveName} constantly aware of ${his2} slavery, <span class="gold">breaking ${slave.slaveName}'s resistance.</span>`); + } else { + r.push(`${He} acts as another pair of eyes watching ${slave.slaveName} and metes out punishments, <span class="gold">improving ${slave.slaveName}'s servitude.</span>`); + } + } + } else if (headGirlsTraining === "paraphilia") { + effectiveness -= (slave.intelligence + slave.intelligenceImplant) / 3; + slave.training += effectiveness; + r.push(`${S.HeadGirl.slaveName} does ${his} best to get ${slave.slaveName} past it with punishments and rewards,`); + if (slave.training > 100) { + r.push(`and <span class="green">resolves ${slave.slaveName}'s paraphilia.</span>`); + slave.training = 0; + slave.sexualFlaw = "none"; + } else { + r.push(`and makes partial progress.`); + } + } else if (headGirlsTraining === "flaw") { + effectiveness -= (slave.intelligence + slave.intelligenceImplant) / 3; + slave.training += effectiveness; + r.push(`${S.HeadGirl.slaveName} punishes ${slave.slaveName} whenever ${he} catches ${him2} indulging in ${his2} bad habits,`); + if (slave.training > 100) { + r.push(`and <span class="green">fixes ${slave.slaveName}'s flaw.</span>`); + slave.training = 0; + if (slave.behavioralFlaw !== "none") { + slave.behavioralFlaw = "none"; + } else if (slave.sexualFlaw !== "none") { + slave.sexualFlaw = "none"; + } + } else { + r.push(`and makes partial progress.`); + } + } else if (headGirlsTraining === "soften") { + effectiveness -= (slave.intelligence + slave.intelligenceImplant) / 3; + slave.training += effectiveness; + r.push(`${He} punishes ${slave.slaveName} whenever ${he} sees ${him2} breaking the rules yet does ${his} best to retain what makes the slave special,`); + if (slave.training > 150) { + slave.training = 0; + r.push(`and successfully <span class="green">softens ${slave.slaveName}'s flaw.</span>`); + if (slave.behavioralFlaw !== "none") { + SoftenBehavioralFlaw(slave); + } else if (slave.sexualFlaw !== "none") { + SoftenSexualFlaw(slave); + } + } else { + r.push(`and makes partial progress.`); + } + } else if (headGirlsTraining === "oral skill") { + slave.training = 0; + if (S.HeadGirl.fetish === "cumslut" && S.HeadGirl.fetishStrength > 60) { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to suck cocks, cunts, and assholes. ${His} enthusiasm for oral sex is infectious. ${slave.slaveName}'s <span class="green">oral skills have improved.</span>`); + slaveSkillIncrease('oral', slave, random(5, 10)); + } else if ((S.HeadGirl.dick > 0) && canPenetrate(S.HeadGirl)) { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to suck cocks, cunts, and assholes. Your Head Girl uses ${his} penis as an effective teaching tool. ${slave.slaveName}'s <span class="green">oral skills have improved.</span>`); + slaveSkillIncrease('oral', slave, random(5, 10)); + } else if ((S.HeadGirl.clit > 2)) { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to suck cocks, cunts, and assholes. Your Head Girl uses ${his} pseudophallus-sized clit as an effective teaching tool. ${slave.slaveName}'s <span class="green">oral skills have improved.</span>`); + slaveSkillIncrease('oral', slave, random(5, 10)); + } else { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to suck cocks, cunts, and assholes. ${slave.slaveName}'s <span class="green">oral skills have improved.</span>`); + } + slaveSkillIncrease('oral', slave, Math.ceil(effectiveness / 10)); + } else if (headGirlsTraining === "anal skill") { + slave.training = 0; + if (S.HeadGirl.fetish === "buttslut" && S.HeadGirl.fetishStrength > 60) { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to take it up the ass. Your Head Girl's enthusiasm for backdoor loving is infectious. ${slave.slaveName}'s <span class="green">anal skills have improved.</span>`); + slaveSkillIncrease('anal', slave, random(5, 10)); + } else if ((S.HeadGirl.dick > 0) && canPenetrate(S.HeadGirl)) { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to take a dick up the butt. Your Head Girl uses ${his} penis as an effective teaching tool. ${slave.slaveName}'s <span class="green">anal skills have improved.</span>`); + slaveSkillIncrease('anal', slave, random(5, 10)); + } else if ((S.HeadGirl.clit > 2)) { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to take a phallus up the butt. Your Head Girl uses ${his} pseudophallus-sized clit as an effective teaching tool. ${slave.slaveName}'s <span class="green">anal skills have improved.</span>`); + slaveSkillIncrease('anal', slave, random(5, 10)); + } else { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to take a dick up the butt. ${slave.slaveName}'s <span class="green">anal skills have improved.</span>`); + } + slaveSkillIncrease('anal', slave, Math.ceil(effectiveness / 10)); + } else if (headGirlsTraining === "fuck skill") { + slave.training = 0; + if (S.HeadGirl.energy > 95) { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to take a dick. Your Head Girl's enthusiasm for sex is infectious. ${slave.slaveName}'s <span class="green">vanilla sex skills have improved.</span>`); + slaveSkillIncrease('vaginal', slave, random(5, 10)); + } else if ((S.HeadGirl.dick > 0) && canPenetrate(S.HeadGirl)) { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to take a dick. Your Head Girl uses ${his} penis as an effective teaching tool. ${slave.slaveName}'s <span class="green">vanilla sex skills have improved.</span>`); + slaveSkillIncrease('vaginal', slave, random(5, 10)); + } else if ((S.HeadGirl.clit > 2)) { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to take a phallus. Your Head Girl uses ${his} pseudophallus-sized clit as an effective teaching tool. ${slave.slaveName}'s <span class="green">vanilla sex skills have improved.</span>`); + slaveSkillIncrease('vaginal', slave, random(5, 10)); + } else { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to take a dick. ${slave.slaveName}'s <span class="green">vanilla sex skills have improved.</span>`); + } + slaveSkillIncrease('vaginal', slave, Math.ceil(effectiveness / 10)); + } else if (headGirlsTraining === "whore skill") { + slave.training = 0; + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to prostitute ${himself2}. ${slave.slaveName}'s <span class="green">whoring skills have improved.</span>`); + slaveSkillIncrease('whoring', slave, Math.ceil(effectiveness / 10)); + } else if (headGirlsTraining === "entertain skill") { + slave.training = 0; + if (S.HeadGirl.fetish === "humiliation" && S.HeadGirl.fetishStrength > 60) { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to entertain. Your Head Girl's enthusiasm for public display is infectious. ${slave.slaveName}'s <span class="green">entertainment skills have improved.</span>`); + slaveSkillIncrease('entertainment', slave, random(5, 10)); + } else { + r.push(`In spare moments ${he} teaches ${slave.slaveName} how to entertain. ${slave.slaveName}'s <span class="green">entertainment skills have improved.</span>`); + } + slaveSkillIncrease('entertainment', slave, Math.ceil(effectiveness / 10)); + } + } + + if (slave.devotion >= -20) { + if (slave.attrKnown === 0) { + slave.attrKnown = 1; + r.push(`${S.HeadGirl.slaveName} also investigates the slave's basic sexual orientation, finding that ${he2} is`); + if (slave.attrXY <= 40) { + r.push(`<span class="red">disgusted by men</span>`); + } else if ((slave.attrXY <= 60)) { + r.push(`indifferent to men`); + } else if ((slave.attrXY <= 80)) { + r.push(`<span class="green">attracted to men</span>`); + } else { + r.push(`<span class="green">intensely attracted to men</span>`); + } + r.push(`and`); + if (slave.attrXX <= 40) { + r.push(`<span class="red">disgusted by women.</span>`); + } else if ((slave.attrXX <= 60)) { + r.push(`indifferent to women.`); + } else if ((slave.attrXX <= 80)) { + r.push(`<span class="green">attracted to women.</span>`); + } else { + r.push(`<span class="green">intensely attracted to women.</span>`); + } + } + } + + if (V.HGPiercings) { + if (slave.devotion >= -20 && slave.genes === "XY" && slave.attrXY <= 35 && V.arcologies[0].FSBodyPurist === "unset" && (V.arcologies[0].FSPaternalist === "unset" || SlaveStatsChecker.modScore(slave).total < 13)) { + piercingCheck(); + } + } + + App.Events.addNode(el, r, "div", "indent"); + return el; + + function piercingCheck() { + let piercingForbidden = 0; + if (slave.earPiercing === 0 && slave.earShape !== "none") { + if (V.arcologies[0].FSDegradationist !== "unset") { + slave.earPiercing = 2; + } else { + slave.earPiercing = 1; + } + RulesDeconfliction(slave); + if (slave.earPiercing !== V.slaveAfterRA.earPiercing) { + piercingForbidden = 1; + slave.earPiercing = 0; + } else { + if (V.arcologies[0].FSDegradationist !== "unset") { + r.push(`${S.HeadGirl.slaveName} knows that ${slave.slaveName} needs to adjust to life as a slave${girl2}, so ${he} has the slave's ears pierced. This will be a constant reminder that ${he2} is simply a sexual object here.`); + } else { + r.push(`${S.HeadGirl.slaveName} knows that ${slave.slaveName} needs help adjusting to life as a slave${girl2}, so ${he} has the slave's ears pierced. A little feminine touch can make a big difference.`); + } + cashX(forceNeg(V.modCost), "slaveMod", slave); + return; + } + } + if (slave.nosePiercing === 0) { + if (V.arcologies[0].FSDegradationist !== "unset") { + slave.nosePiercing = 2; + } else { + slave.nosePiercing = 1; + } + RulesDeconfliction(slave); + if (slave.nosePiercing !== V.slaveAfterRA.nosePiercing) { + piercingForbidden = 1; + slave.nosePiercing = 0; + } else { + if (V.arcologies[0].FSDegradationist !== "unset") { + r.push(`${S.HeadGirl.slaveName} knows that ${slave.slaveName} needs to adjust to life as a slave${girl2}, so ${he} gives the slave nasal studs and a large septum ring. It should push ${slave.slaveName} to see ${himself2} as a sexual object for others to use.`); + } else { + r.push(`${S.HeadGirl.slaveName} knows that ${slave.slaveName} needs help adjusting to life as a slave${girl2}, so ${he} gives the slave a cute little nose piercing. It should help ${slave.slaveName} see ${himself2} as a bit more feminine.`); + } + cashX(forceNeg(V.modCost), "slaveMod", slave); + return; + } + } + if (slave.eyebrowPiercing === 0) { + if (V.arcologies[0].FSDegradationist !== "unset") { + slave.eyebrowPiercing = 2; + } else { + slave.eyebrowPiercing = 1; + } + RulesDeconfliction(slave); + if (slave.eyebrowPiercing !== V.slaveAfterRA.eyebrowPiercing) { + piercingForbidden = 1; + slave.eyebrowPiercing = 0; + } else { + if (V.arcologies[0].FSDegradationist !== "unset") { + r.push(`${S.HeadGirl.slaveName} knows that ${slave.slaveName} needs to adjust to life as a slave${girl2}, so ${he} gives the slave multiple eyebrow piercings. A slutty touch for a slave${girl2} should help ${him2} feel a little hungrier for cock.`); + } else { + r.push(`${S.HeadGirl.slaveName} knows that ${slave.slaveName} needs help adjusting to life as a slave${girl2}, so ${he} gives the slave a cute little eyebrow piercing. A slutty touch for a slave${girl2} should help ${him2} feel a little hungrier for cock.`); + } + cashX(forceNeg(V.modCost), "slaveMod", slave); + return; + } + } + if (slave.lipsPiercing === 0) { + if (V.arcologies[0].FSDegradationist !== "unset") { + slave.lipsPiercing = 2; + } else { + slave.lipsPiercing = 1; + } + RulesDeconfliction(slave); + if (slave.lipsPiercing !== V.slaveAfterRA.lipsPiercing) { + piercingForbidden = 1; + slave.lipsPiercing = 0; + } else { + if (V.arcologies[0].FSDegradationist !== "unset") { + r.push(`${S.HeadGirl.slaveName} knows that ${slave.slaveName} needs to adjust to life as a slave${girl2}, so ${he} has the slave's lower lip pierced. ${his2} mouth is for pleasing penises now, so it'll help ${him2} if it looks like it.`); + } else { + r.push(`${S.HeadGirl.slaveName} knows that ${slave.slaveName} needs help adjusting to life as a slave${girl2}, so ${he} has the slave's lower lip pierced. ${his2} mouth is for pleasing penises now, so it'll help ${him2} if it looks like it.`); + } + cashX(forceNeg(V.modCost), "slaveMod", slave); + return; + } + } + if (slave.navelPiercing === 0) { + if (V.arcologies[0].FSDegradationist !== "unset") { + slave.navelPiercing = 2; + } else { + slave.navelPiercing = 1; + } + RulesDeconfliction(slave); + if (slave.navelPiercing !== V.slaveAfterRA.navelPiercing) { + piercingForbidden = 1; + slave.navelPiercing = 0; + } else { + if (V.arcologies[0].FSDegradationist !== "unset") { + r.push(`${S.HeadGirl.slaveName} knows that ${slave.slaveName} needs help adjusting to life as a slave${girl2}, so ${he} has the slave's navel pierced with a big ring. Whatever ${he2} thinks in ${his2} mind, S.HeadGirl.slaveName makes clear to ${him2} that ${his2} body belongs to you.`); + } else { + r.push(`${S.HeadGirl.slaveName} knows that ${slave.slaveName} needs help adjusting to life as a slave${girl2}, so ${he} has the slave's navel pierced. The prettier ${his2} lower half looks, the less reluctant ${he2} should feel to take it up the butt.`); + } + cashX(forceNeg(V.modCost), "slaveMod", slave); + return; + } + } + if (piercingForbidden) { + if (V.arcologies[0].FSDegradationist !== "unset") { + r.push(`${S.HeadGirl.slaveName} thinks some piercings might push ${slave.slaveName} to adjust to life as a slave${girl2}, but ${he} also knows you have rules applied to this slave that forbid it.`); + } else { + r.push(`${S.HeadGirl.slaveName} thinks some cute piercings might help ${slave.slaveName} adjust to life as a slave${girl2}, but ${he} also knows you have rules applied to this slave that forbid it.`); + } + } + } + } + + function slavesToTrain() { + if (S.HeadGirl) { + /** @type {FC.HeadGirlTrainee[][]} */ + const HGPossibleSlaves = [[], [], [], [], [], []]; + for (const slave of V.slaves) { + if (!assignmentVisible(slave) || slave.fuckdoll === 1 || slave.ID === V.BodyguardID || slave.ID === V.HeadGirlID || slave.fetish === "mindbroken") { + continue; + } else if (Array.isArray(V.personalAttention) && V.personalAttention.some(p => p.ID === slave.ID)) { + continue; + } + + if (V.headGirlTrainsHealth && slave.health.condition < -20) { + HGPossibleSlaves[0].push({ID: slave.ID, training: "health"}); + continue; + } + + if (slave.health.tired < 50) { + const hasParaphilia = (App.Data.misc.paraphiliaList.includes(slave.sexualFlaw)); + if (V.headGirlTrainsParaphilias && hasParaphilia) { + HGPossibleSlaves[1].push({ID: slave.ID, training: "paraphilia"}); + continue; + } + + if (V.headGirlTrainsFlaws || V.headGirlSoftensFlaws) { + if (slave.behavioralFlaw !== "none" || (slave.sexualFlaw !== "none" && !hasParaphilia)) { + if (V.headGirlSoftensFlaws) { + if (slave.devotion > 20) { + if ((slave.behavioralFlaw !== "none" && slave.behavioralQuirk === "none") || (slave.sexualFlaw !== "none" && slave.sexualQuirk === "none" && !hasParaphilia)) { + HGPossibleSlaves[3].push({ID: slave.ID, training: "soften"}); + } else { + HGPossibleSlaves[3].push({ID: slave.ID, training: "flaw"}); + } + continue; + } + } else if (V.headGirlTrainsFlaws) { + HGPossibleSlaves[2].push({ID: slave.ID, training: "flaw"}); + continue; + } + } + } + + if (V.headGirlTrainsObedience && slave.devotion <= 20 && slave.trust >= -20) { + HGPossibleSlaves[4].push({ID: slave.ID, training: "obedience"}); + continue; + } + + if (V.headGirlTrainsSkills) { + if (slave.skill.oral < S.HeadGirl.skill.oral) { + HGPossibleSlaves[5].push({ID: slave.ID, training: "oral skill"}); + } else if ((slave.skill.vaginal < S.HeadGirl.skill.vaginal) && (slave.vagina > 0) && (canDoVaginal(slave))) { + HGPossibleSlaves[5].push({ID: slave.ID, training: "fuck skill"}); + } else if ((slave.skill.anal < S.HeadGirl.skill.anal) && (slave.anus > 0) && (canDoAnal(slave))) { + HGPossibleSlaves[5].push({ID: slave.ID, training: "anal skill"}); + } else if (slave.skill.whoring < S.HeadGirl.skill.whoring) { + HGPossibleSlaves[5].push({ID: slave.ID, training: "whore skill"}); + } else if ((slave.skill.entertainment < S.HeadGirl.skill.entertainment) && !isAmputee(slave)) { + HGPossibleSlaves[5].push({ID: slave.ID, training: "entertain skill"}); + } + } + } + } + return HGPossibleSlaves.flatten().slice(0, App.EndWeek.saVars.HGEnergy); + } else { + return []; + } + } +}; diff --git a/src/endWeek/reports/personalAttention.js b/src/endWeek/reports/personalAttention.js index bbe8dcb0aae1eb2d99400a44db52ddc7c2e7af2c..384c10e3778c0f1246a9bb137fc3e38f300d8c8d 100644 --- a/src/endWeek/reports/personalAttention.js +++ b/src/endWeek/reports/personalAttention.js @@ -62,7 +62,7 @@ globalThis.personalAttention = (function() { el.append(`Since ${he}'s obedient, `); App.UI.DOM.appendNewElement("span", el, `${his} training assignment has defaulted to softening ${his} behavioral flaw. `, "yellow"); pa.trainingRegimen = "soften her behavioral flaw"; - } else if ((slave.devotion > 20) && (slave.sexualQuirk === "none") && !["abusive", "anal addict", "attention whore", "breast growth", "breeder", "cum addict", "malicious", "neglectful", "none", "self hating"].includes(slave.sexualFlaw)) { + } else if ((slave.devotion > 20) && (slave.sexualQuirk === "none") && !App.Data.misc.paraphiliaList.includes(slave.sexualFlaw) && slave.sexualFlaw !== "none") { el.append(`Since ${he}'s obedient, `); App.UI.DOM.appendNewElement("span", el, `${his} training assignment has defaulted to softening ${his} sexual flaw. `, "yellow"); pa.trainingRegimen = "soften her sexual flaw"; @@ -70,7 +70,7 @@ globalThis.personalAttention = (function() { el.append(`Since ${he}'s obedient and already has a behavioral quirk, `); App.UI.DOM.appendNewElement("span", el, `${his} training assignment has defaulted to removing ${his} behavioral flaw. `, "yellow"); pa.trainingRegimen = "fix her behavioral flaw"; - } else if ((slave.devotion > 20) && !["abusive", "anal addict", "attention whore", "breast growth", "breeder", "cum addict", "malicious", "neglectful", "none", "self hating"].includes(slave.sexualFlaw)) { + } else if ((slave.devotion > 20) && !App.Data.misc.paraphiliaList.includes(slave.sexualFlaw)&& slave.sexualFlaw !== "none") { el.append(`Since ${he}'s obedient and already has a sexual quirk, `); App.UI.DOM.appendNewElement("span", el, `${his} training assignment has defaulted to removing ${his} sexual flaw. `, "yellow"); pa.trainingRegimen = "fix her sexual flaw"; @@ -88,7 +88,7 @@ globalThis.personalAttention = (function() { /** * @param {App.Entity.SlaveState} slave - * @returns {Node} + * @returns {HTMLElement} */ function personalAttention(slave) { const el = document.createElement("p"); @@ -326,7 +326,7 @@ globalThis.personalAttention = (function() { r.push(`${slave.slaveName} got over ${his} behavioral flaw without you;`); coloredText = []; coloredText.push(`${his} training assignment has defaulted to`); - if (["abusive", "anal addict", "attention whore", "breast growth", "breeder", "cum addict", "malicious", "neglectful", "none", "self hating"].includes(slave.sexualFlaw)) { + if (App.Data.misc.paraphiliaList.includes(slave.sexualFlaw) && slave.sexualFlaw !== "none") { if ((slave.devotion <= 20) && (slave.trust >= -20)) { coloredText.push(`breaking ${his} will.`); pa.trainingRegimen = "break her will"; diff --git a/src/endWeek/reports/spaReport.js b/src/endWeek/reports/spaReport.js new file mode 100644 index 0000000000000000000000000000000000000000..b1cbd22ac63c7dda95ec86f27fd9482ce8aba24e --- /dev/null +++ b/src/endWeek/reports/spaReport.js @@ -0,0 +1,436 @@ +/** + * @returns {DocumentFragment} + */ +App.EndWeek.spaReport = function() { + const el = new DocumentFragment(); + let r; + + const slaves = App.Utils.sortedEmployees(App.Entity.facilities.spa); + let healthBonus = 0, restedSlaves = 0, restedSlave; + let devBonus = (V.spaDecoration !== "standard") ? 1 : 0; + + V.flSex = App.EndWeek.getFLSex(App.Entity.facilities.spa); /* FIXME: should be local, passed as a parameter to saRules */ + + if (S.Attendant) { + let idleBonus = 0; + let bonusToggle = 0; + let FLsFetish = 0; + r = []; + + if (S.Attendant.health.condition < 100) { + improveCondition(S.Attendant, normalRandInt(20)); + } + if (S.Attendant.devotion <= 60) { + S.Attendant.devotion++; + } + if (S.Attendant.trust < 60) { + S.Attendant.trust++; + } + if (S.Attendant.rules.living !== "luxurious") { + S.Attendant.rules.living = "luxurious"; + } + if (S.Attendant.fetishStrength <= 95) { + if (S.Attendant.fetish !== "submissive") { + if (fetishChangeChance(S.Attendant) > random(0, 100)) { + FLsFetish = 1; + S.Attendant.fetishKnown = 1; + S.Attendant.fetish = "submissive"; + } + } else if (S.Attendant.fetishKnown === 0) { + FLsFetish = 1; + S.Attendant.fetishKnown = 1; + } else { + FLsFetish = 2; + S.Attendant.fetishStrength += 4; + } + } + if (S.Attendant.fetish === "none" || S.Attendant.fetish === "submissive") { + devBonus++; + } + S.Attendant.devotion += devBonus; + const { + He, His, + he, his, him, himself, wife + } = getPronouns(S.Attendant); + r.push(`${SlaveFullName(S.Attendant)} is serving as the spa attendant.`); + if (S.Attendant.relationship === -3 && S.Attendant.devotion > 50) { + r.push(`${He} tries ${his} best to be your perfect attentive, caring and loving ${wife}.`); + } + if (FLsFetish === 1) { + r.push(`When ${he} is paid a visit by a slave with sexual issues to work out, ${he} provides them with an understanding, willing, giving partner. ${He} finds real satisfaction in helping your slaves find sexual gratification, and <span class="lightsalmon">becomes a submissive.</span>`); + } else if ((FLsFetish === 2)) { + r.push(`Every new slave in the spa is a new person ${he} gets to connect with and serve. Sexually. <span class="lightsalmon">${He} becomes more submissive.</span>`); + } + if (setup.attendantCareers.includes(S.Attendant.career)) { + r.push(`${He} has experience with counseling from ${his} life before ${he} was a slave, making ${him} better at building rapport with troubled slaves, and giving ${him} a better chance of softening flaws into beneficial quirks.`); + bonusToggle = 1; + idleBonus++; + } else if (S.Attendant.skill.attendant >= V.masteredXP) { + r.push(`${He} has experience with counseling from working for you, making ${him} better at building rapport with troubled slaves, and giving ${him} a better chance of softening flaws into beneficial quirks.`); + bonusToggle = 1; + idleBonus++; + } else { + S.Attendant.skill.attendant += random(1, Math.ceil((S.Attendant.intelligence + S.Attendant.intelligenceImplant) / 15) + 8); + } + if (!canSee(S.Attendant)) { + r.push(`${His} blindness allows ${him} to deeply connect with ${his} charges.`); + idleBonus++; + } + if (S.Attendant.fetish === "none") { + r.push(`${S.Attendant.slaveName} respects the slaves lounging in the spa, allowing them to relax completely.`); + idleBonus++; + } else if (S.Attendant.fetish === "submissive") { + r.push(`${S.Attendant.slaveName} lets the slaves resting in the spa take the lead sexually, doing ${his} best to please them.`); + idleBonus++; + } else if (S.Attendant.fetishKnown === 1) { + r.push(`${S.Attendant.slaveName} can't keep ${his} ${hasBothArms(S.Attendant) ? `hands` : `hand`} to ${himself}, preventing the slaves in the spa from relaxing completely.`); + } + if (S.Attendant.visualAge > 35) { + r.push(`${His} apparent maturity encourages the slaves in the spa to relax and pour out their troubles to ${him}.`); + healthBonus++; + idleBonus++; + } + if (S.Attendant.intelligence + S.Attendant.intelligenceImplant > 15) { + r.push(`${He}'s so intelligent ${he} can suss out the cause of slaves' emotional issues and counsel them effectively.`); + idleBonus++; + } + if (isFertile(S.Attendant) || (S.Attendant.bellyPreg >= 1500) || (S.Attendant.counter.birthsTotal > 0) || (S.Attendant.bellyImplant >= 1500)) { + r.push(`${He} has a natural mothering instinct and really makes ${his} charges feel at home.`); + idleBonus++; + healthBonus++; + } + let attendantUsedCure = false; + App.Events.addNode(el, r, "div", "indent"); + const softenFlawBonus = bonusToggle ? 10 : 0; + for (const slave of slaves) { + const {he2, his2, him2} = getPronouns(slave).appendSuffix("2"); + r = []; + if (slave.fetish === "mindbroken" && slave.health.condition > 20 && !attendantUsedCure && V.spaFix !== 2) { + attendantUsedCure = true; + if (random(1, 100) > 90 - S.Attendant.devotion) { + const curedSlave = App.UI.DOM.makeElement("div", null, "indent"); + const curedArray = [`<span class="green">Something almost miraculous has happened.</span> ${S.Attendant.slaveName} has always refused to believe that ${slave.slaveName} could not be reached, and has lavished patient tenderness on ${him2} in ${V.spaName}. ${slave.slaveName} has begun to respond, and is stirring from ${his2} mental torpor.`]; + slave.devotion = -3; + slave.sexualFlaw = "apathetic"; + slave.behavioralFlaw = either("hates men", "odd"); + slave.fetish = "none"; + slave.fetishKnown = 1; + const gp = V.genePool.find(s => s.ID === slave.ID); + if (gp.intelligence >= -95) { + slave.intelligence = gp.intelligence - 30; + } + if (V.arcologies[0].FSPaternalist !== "unset" && V.arcologies[0].FSPaternalist > 0) { + curedArray.push(`Society <span class="green">strongly approves</span> of${slave.slaveName} being restored to sanity, which advances ideals about enlightened slaveownership.`); + V.arcologies[0].FSPaternalist += 0.01 * V.FSSingleSlaveRep; + repX(2 * V.FSSingleSlaveRep * (V.arcologies[0].FSPaternalist / V.FSLockinLevel), "spa", slave); + } + App.Events.addNode(curedSlave, curedArray); + r.push(curedSlave); + } + } + if (bonusToggle === 1 && slave.trust < 60) { + slave.trust++; + } + if (S.Attendant.rivalryTarget === slave.ID) { + r.push(`${He} constantly harasses ${his} ${rivalryTerm(S.Attendant)}, ${slave.slaveName}, preventing ${him2} from getting comfortable and forcing ${him2} to keep ${his2} guard up.`); + slave.devotion -= 4; + slave.trust -= 4; + if (random(1, 100) > 35) { + S.Attendant.rivalry++; + S.Attendant.rivalry++; + slave.rivalry++; + } + } else if (S.Attendant.relationshipTarget === slave.ID) { + r.push(`${He} dedicates most of ${his} attention to ${his} ${relationshipTerm(S.Attendant)}, ${slave.slaveName}, making ${his2} stress, both physical and mental, wash away.`); + slave.devotion += 3; + slave.trust += 3; + } else if (areRelated(S.Attendant, slave)) { + r.push(`${He} makes sure to spend extra time caring for ${his} ${relativeTerm(S.Attendant, slave)}, ${slave.slaveName}.`); + slave.trust++; + improveCondition(slave, 1); + } + switch (slave.prestigeDesc) { + case "$He is a famed Free Cities whore, and commands top prices.": + r.push(`${He} does ${his} best to relax the famous whore,${slave.slaveName}, making sure to`); + if (slave.vagina > 2 || slave.anus > 2) { + r.push(`pay special attention to ${his2} worn holes.`); + } else { + r.push(`get ${him2} clean and relaxed for ${his2} next usage.`); + } + slave.devotion += 3; + slave.trust += 3; + break; + case "$He is a famed Free Cities slut, and can please anyone.": + r.push(`${He} does ${his} best to soothe the famous entertainer, ${slave.slaveName}, letting ${him2} relax in blissful peace.`); + slave.devotion += 3; + slave.trust += 3; + break; + case "$He is remembered for winning best in show as a cockmilker.": + if (slave.balls > 6 && slave.dick !== 0) { + if (S.Attendant.fetish === "cumslut") { + r.push(`${He} can't keep ${his} ${hasBothArms(S.Attendant) ? `hands` : `hand`} off ${slave.slaveName}'s cock and balls, but ${he2} doesn't mind being milked constantly. Before long, strands of cum can be found floating all throughout the bath.`); + S.Attendant.fetishStrength += 4; + } else { + r.push(`${He} does ${his} best to accommodate ${slave.slaveName}'s massive genitals and tends to ${him2} whenever ${he2} feels a need for release.`); + if (random(1, 100) > 65 && S.Attendant.fetish === "none") { + r.push(`After taking several massive loads to the face, ${S.Attendant.slaveName} begins to find satisfaction in being coated in cum.`); + S.Attendant.fetish = "cumslut"; + } + } + } + slave.devotion += 3; + slave.trust += 3; + break; + case "$He is remembered for winning best in show as a dairy cow.": + if (slave.lactation > 0 && (slave.boobs - slave.boobsImplant) > 6000) { + if (S.Attendant.fetish === "boobs") { + r.push(`${He} can't keep ${his} ${hasBothArms(S.Attendant) ? `hands` : `hand`} off ${slave.slaveName}'s huge breasts, but ${he2} doesn't mind being milked constantly. Before long the bath gains a white tint.`); + S.Attendant.fetishStrength += 4; + S.Attendant.fetishStrength += 4; + } else { + r.push(`${He} does ${his} best to accommodate ${slave.slaveName}'s massive breasts and tends to ${him2} whenever ${he2} feels a need for release.`); + if (random(1, 100) > 65 && S.Attendant.fetish === "none") { + r.push(`After multiple milking sessions, ${S.Attendant.slaveName} begins to find ${himself} fantasizing about having giant milky breasts too.`); + S.Attendant.fetish = "boobs"; + } + } + slave.devotion += 3; + slave.trust += 3; + slave.lactationDuration = 2; + slave.boobs -= slave.boobsMilk; + slave.boobsMilk = 0; + } + break; + case "$He is remembered for winning best in show as a breeder.": + if (slave.bellyPreg >= 5000) { + if (S.Attendant.fetish === "pregnancy") { + r.push(`${He} can't keep ${his} ${hasBothArms(S.Attendant) ? `hands` : `hand`} off ${slave.slaveName}'s pregnancy, but ${he2} doesn't mind ${his2} full belly being fondled.`); + S.Attendant.fetishStrength += 4; + S.Attendant.fetishStrength += 4; + } else { + r.push(`${He} does ${his} best to accommodate ${slave.slaveName}'s pregnancy and to make sure the mother-to-be is happy and comfortable.`); + if (random(1, 100) > 65 && S.Attendant.fetish === "none") { + r.push(`After massaging ${slave.slaveName}'s growing belly multiple times, ${S.Attendant.slaveName} begins to find ${himself} fantasizing about being swollen with life too.`); + S.Attendant.fetish = "pregnancy"; + } + } + slave.devotion += 3; + slave.trust += 3; + } else { + if (S.Attendant.fetish === "pregnancy") { + r.push(`${He} can't help but pester ${slave.slaveName} with questions about ${his2} famous pregnancy, limiting ${his2} ability to truly relax.`); + slave.devotion += 1; + slave.trust += 1; + } else if (canGetPregnant(slave)) { + r.push(`${He} does ${his} best to encourage ${slave.slaveName}'s fertilization by performing any fertility boosting actions ${he} can.`); + slave.devotion += 3; + slave.trust += 3; + } + } + } + if ( + !attendantUsedCure && + (S.Attendant.intelligence + S.Attendant.intelligenceImplant > 15) && + (S.Attendant.intelligence + S.Attendant.intelligenceImplant + softenFlawBonus) > random(1, 200) && + (V.spaFix === 0) + ) { + if (slave.behavioralFlaw !== "none") { + SoftenBehavioralFlaw(slave); + attendantUsedCure = true; + r.push(`${S.Attendant.slaveName} works carefully with ${slave.slaveName}, and successfully`); + r.push(App.UI.DOM.makeElement("span", `softens ${his2} behavioral flaw`, "green")); + r.push(`into an appealing quirk.`); + } else if (slave.sexualFlaw !== "none") { + SoftenSexualFlaw(slave); + attendantUsedCure = true; + r.push(`${S.Attendant.slaveName} works carefully with ${slave.slaveName}, and successfully`); + r.push(App.UI.DOM.makeElement("span", `softens ${his2} sexual flaw`, "green")); + r.push(`into an appealing quirk.`); + } + } + if (slave.lactation > 0) { + r.push(`${S.Attendant.slaveName} takes care to keep ${slave.slaveName}'s breasts comfortably drained.`); + slave.lactationDuration = 2; + slave.boobs -= slave.boobsMilk; + slave.boobsMilk = 0; + } + App.Events.addNode(el, r, "div", "indent"); + } + + if (slaves.length < V.spa) { + const seed = random(1, 10) + ((V.spa - slaves.length) * (random(150, 170) + (idleBonus * 10))); + cashX(seed, "spa", S.Attendant); + r = []; + r.push(`Since ${he} doesn't have enough slaves to occupy all ${his} time, the spa takes in citizens' slaves on a contract basis and ${he} helps them too, earning <span class="yellowgreen"> ${cashFormat(seed)}.</span>`); + if (V.arcologies[0].FSHedonisticDecadence > 0 && slaves.length === 0) { + r.push(`Society <span class="green">loves</span> being allowed to lounge in your spa, greatly advancing your laid back culture.`); + FutureSocieties.Change("Hedonistic", 2); + } + App.Events.addNode(el, r, "div", "indent"); + } + } + + if (slaves.length > 0) { + r = []; + if (slaves.length > 1) { + r.push(`There are ${slaves.length} slaves`); + } else { + r.push(`There is one slave`); + } + r.push(`resting and recuperating in the spa.`); + App.Events.addNode(el, r, "p", ["indent", "bold"]); + } + + if (S.Attendant) { + const slave = S.Attendant; + /* apply following SA passages to facility leader */ + if (V.showEWD !== 0) { + const attendantEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); + if (V.seeImages && V.seeReportImages) { + App.UI.DOM.appendNewElement("div", attendantEntry, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]); + } + attendantEntry.append(App.EndWeek.favoriteIcon(slave), " "); + App.Events.addNode( + attendantEntry, + [ + App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name"), + `is serving as the Attendant in ${V.spaName}`, + App.SlaveAssignment.standardSlaveReport(slave, false), + ] + ); + } else { + App.SlaveAssignment.standardSlaveReport(slave, true); + } + } + + for (const slave of slaves) { + const {He, he, his} = getPronouns(slave); + slave.devotion += devBonus; + improveCondition(slave, 5 + healthBonus); + if (slave.health.condition < -80) { + improveCondition(slave, 15); + } else if (slave.health.condition < -40) { + improveCondition(slave, 10); + } else if (slave.health.condition < 0) { + improveCondition(slave, 5); + } + if (V.spaUpgrade === 1 && slave.health.condition < 100) { + improveCondition(slave, normalRandInt(8)); + } + if (slave.devotion < 60 && slave.trust < 60) { + slave.devotion++; + slave.trust++; + } else if ((slave.trust < 40)) { + slave.trust += 10; + } else if ((slave.devotion < 40)) { + slave.devotion += 10; + } + switch (V.spaDecoration) { + case "Chattel Religionist": + case "Chinese Revivalist": + slave.rules.living = "normal"; + break; + case "Degradationist": + slave.rules.living = "spare"; + break; + default: + slave.rules.living = "luxurious"; + } + if (slave.health.condition >= 20 && slave.health.tired <= 30 && slave.trust > 60 && slave.devotion > 60 && slave.fetish !== "mindbroken" && slave.sexualFlaw === "none" && slave.behavioralFlaw === "none") { + const slaveFixed = App.UI.DOM.makeElement("p"); + App.Events.addNode( + slaveFixed, + [ + App.UI.DOM.makeElement("span", slave.slaveName, "slave-name"), + `is feeling well enough to leave ${V.spaName}, ` + ] + ); + r = []; + if (V.assignmentRecords[slave.ID]) { + const oldJob = V.assignmentRecords[slave.ID]; + assignJobSafely(slave, oldJob); + if (slave.choosesOwnAssignment === 1) { + r.push(`and ${he} is resting before choosing another task.`); + } else if (slave.assignment === "rest") { + if (oldJob !== "rest") { + r.push(`and since ${he} was unable to return to ${his} old task to ${oldJob}, ${his} assignment has defaulted to rest.`); + } else { + r.push(`so ${he} has returned to rest.`); + } + } else { + r.push(`so ${he} goes back to ${slave.assignment}.`); + } + } else { + r.push(`so ${his} assignment has defaulted to rest.`); + removeJob(slave, "rest in the spa"); + } + App.Events.addNode(slaveFixed, r, "span", "noteworthy"); + el.append(slaveFixed); + restedSlaves++; + restedSlave = slave; + continue; + } + + if (V.showEWD !== 0) { + const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); + if (V.seeImages && V.seeReportImages) { + App.UI.DOM.appendNewElement("div", slaveEntry, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]); + } + slaveEntry.append(App.EndWeek.favoriteIcon(slave), " "); + r = []; + r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name")); + if (slave.choosesOwnAssignment === 2) { + r.push(App.SlaveAssignment.choosesOwnJob(slave)); + } else { + r.push(`is resting in ${V.spaName}.`); + } + App.Events.addNode(slaveEntry, r, "div"); + + r = []; + r.push(He); + r.push(App.SlaveAssignment.rest(slave)); + + if (slave.fetish === "mindbroken") { + r.push(`${He} remains in the Spa, completely mindbroken.`); + } else if (slave.sexualFlaw !== "none" || slave.behavioralFlaw !== "none") { + r.push(`${He} remains in the Spa, stubborn in ${his} flaw.`); + } else if (slave.trust < 60 || slave.devotion < 60) { + r.push(`${He} remains in the Spa, as ${he} is still learning to accept life as a slave.`); + } else if (slave.health.condition < 20) { + r.push(`${He} remains in the Spa, as ${he} is benefiting from its healing properties.`); + } else if (slave.health.tired > 30) { + r.push(`${He} remains in the Spa, continuing to soak away ${his} fatigue.`); + } + r.push(App.SlaveAssignment.standardSlaveReport(slave, false)); + App.Events.addNode(slaveEntry, r, "div", "indent"); + } else { + // discard return values silently + App.SlaveAssignment.choosesOwnJob(slave); + App.SlaveAssignment.standardSlaveReport(slave, true); + } + } + + if (restedSlaves > 0) { + const {he, him} = getPronouns(restedSlave); + r = []; + if (restedSlaves === 1) { + r.push(`One slave has rested until ${he} reached a state of <span class="hotpink">devotion</span> and <span class="mediumaquamarine">trust</span> and will leave the spa before the end of the week.`); + } else { + r.push(`${restedSlaves} slaves have rested until they reached a state of <span class="hotpink">devotion</span> and <span class="mediumaquamarine">trust</span> and will leave the spa before the end of the week.`); + } + App.Events.addNode(el, r, "p", "indent"); + if (V.spaDecoration !== "standard") { + r = []; + r.push(`${capFirstChar(V.spaName)}'s ${V.spaDecoration} atmosphere <span class="hotpink">had an impact on`); + if (restedSlaves === 1) { + r.push(`${him} while ${he} was`); + } else { + r.push(`them while they were`); + } + r.push(`</span> resting.`); + App.Events.addNode(el, r, "p", "indent"); + } + } + + return el; +}; diff --git a/src/endWeek/reportsTW/arcadeReport.tw b/src/endWeek/reportsTW/arcadeReport.tw new file mode 100644 index 0000000000000000000000000000000000000000..148369a2fec675ff39744ceb9110aad1d82f191c --- /dev/null +++ b/src/endWeek/reportsTW/arcadeReport.tw @@ -0,0 +1,3 @@ +:: Arcade Report [nobr] + +<<includeDOM App.EndWeek.arcadeReport()>> diff --git a/src/endWeek/reportsTW/cellblockReport.tw b/src/endWeek/reportsTW/cellblockReport.tw new file mode 100644 index 0000000000000000000000000000000000000000..7982248f27c1b82c67f742f925b2cec4f66f0de7 --- /dev/null +++ b/src/endWeek/reportsTW/cellblockReport.tw @@ -0,0 +1,5 @@ +:: Cellblock Report [nobr] + +/* This passage probably isn't really necessary but it helps organize the profiler output. + * TODO: Once all the facility reports look like this, we should probably get rid of these intermediate passages. */ +<<includeDOM App.EndWeek.cellblockReport()>> diff --git a/src/endWeek/reportsTW/penthouseReport.tw b/src/endWeek/reportsTW/penthouseReport.tw new file mode 100644 index 0000000000000000000000000000000000000000..76857d1b84df48b6af0145a9a63d34104bf78731 --- /dev/null +++ b/src/endWeek/reportsTW/penthouseReport.tw @@ -0,0 +1,3 @@ +:: Penthouse Report [nobr] + +<<includeDOM App.EndWeek.penthouseReport()>> diff --git a/src/endWeek/reportsTW/spaReport.tw b/src/endWeek/reportsTW/spaReport.tw new file mode 100644 index 0000000000000000000000000000000000000000..66addcfb79267c42028517494fb0128cb299fc59 --- /dev/null +++ b/src/endWeek/reportsTW/spaReport.tw @@ -0,0 +1,3 @@ +:: Spa Report [nobr] + +<<includeDOM App.EndWeek.spaReport()>> diff --git a/src/endWeek/saChoosesOwnJob.js b/src/endWeek/saChoosesOwnJob.js index f59353abde47fc5268fa7546b00439183a53685a..5291eb2344ea5b066f5800391c37ef6365be8464 100644 --- a/src/endWeek/saChoosesOwnJob.js +++ b/src/endWeek/saChoosesOwnJob.js @@ -75,89 +75,89 @@ App.SlaveAssignment.choosesOwnJob = (function() { if (slave.relationship === -3 && slave.devotion < -20) { choice.push(`is reluctantly married to you, and ${he} thinks of all the ways ${he} <span class="devotion dec">can take advantage of this,</span>`); if (V.universalRulesAssignsSelfFacility === 1 && V.spa > spaL) { - choice.push(`so ${he} heads straight to ${V.spaName} to relax.`); + choice.push(`so ${he} <span class="job change">heads straight to ${V.spaName}</span> to relax.`); choice.push(assignJob(slave, "rest in the spa")); } else { - choice.push(`so ${he} cheerfully decides to lounge about the penthouse.`); + choice.push(`so ${he} cheerfully <span class="job change">decides to lounge about the penthouse.</span>`); choice.push(removeJob(slave, slave.assignment)); } } else { - choice.push(`decides to rest, taking advantage of your permission to <span class="devotion dec">remain indolent.</span>`); + choice.push(`<span class="job change">decides to rest</span>, taking advantage of your permission to <span class="devotion dec">remain indolent.</span>`); choice.push(removeJob(slave, slave.assignment)); } slave.devotion -= 5; } else if (slave.health.illness > 1) { if (V.universalRulesAssignsSelfFacility === 1 && V.clinic > clinicL) { - choice.push(`is ill, so ${he} decides to get treatment at ${V.clinicName}.`); + choice.push(`is ill, so ${he} <span class="job change">decides to get treatment at ${V.clinicName}.</span>`); choice.push(assignJob(slave, "get treatment in the clinic")); } else { - choice.push(`is ill, so ${he} decides to rest.`); + choice.push(`is ill, so ${he} <span class="job change">decides to rest.</span>`); choice.push(removeJob(slave, slave.assignment)); } } else if (slave.health.condition < 20) { if (V.universalRulesAssignsSelfFacility === 1 && V.spa > spaL) { - choice.push(`is unhealthy, so ${he} decides to get recover at ${V.spaName}.`); + choice.push(`is unhealthy, so ${he} <span class="job change">decides to recover at ${V.spaName}.</span>`); choice.push(assignJob(slave, "rest in the spa")); } else { - choice.push(`is unhealthy, so ${he} decides to rest.`); + choice.push(`is unhealthy, so ${he} <span class="job change">decides to rest.</span>`); choice.push(removeJob(slave, slave.assignment)); } } else if (slave.health.tired > 45) { if (V.universalRulesAssignsSelfFacility === 1 && V.spa > spaL) { - choice.push(`is tired, so ${he} decides to recover at ${V.spaName}.`); + choice.push(`is tired, so ${he} <span class="job change">decides to recover at ${V.spaName}.</span>`); choice.push(assignJob(slave, "rest in the spa")); } else { - choice.push(`is tired, so ${he} decides to rest.`); + choice.push(`is tired, so ${he} <span class="job change">decides to rest.</span>`); choice.push(removeJob(slave, slave.assignment)); } } else if (slave.boobsMilk > 0) { - choice.push(`rushes to get milked since ${his} breasts have become painfully engorged.`); + choice.push(`<span class="job change">rushes to get milked</span> since ${his} breasts have become painfully engorged.`); choice.push(assignJob(slave, "get milked")); } else if (slave.intelligenceImplant < 15 && slave.intelligence > 10 && (arcology.FSPaternalist > 20 || arcology.FSSlaveProfessionalism > 20) && arcology.FSGenderFundamentalistLawBimbo !== 1 ) { if (V.universalRulesAssignsSelfFacility === 1 && V.schoolroom > schoolL) { - choice.push(`is uneducated, so ${he} sits ${himself} down in ${V.schoolroomName}.`); + choice.push(`is uneducated, so ${he} <span class="job change">sits ${himself} down in ${V.schoolroomName}.</span>`); choice.push(assignJob(slave, "learn in the schoolroom")); } else { - choice.push(`is uneducated, so ${he} sits ${himself} down to learn.`); + choice.push(`is uneducated, so ${he} <span class="job change">sits ${himself} down to learn.</span>`); choice.push(assignJob(slave, "take classes")); } } else if ((S.Attendant && V.universalRulesAssignsSelfFacility === 1 && V.spa > spaL) && (slave.devotion < 45 || slave.trust < 45 || (slave.sexualFlaw !== "none" && !setup.paraphiliaList.includes(slave.sexualFlaw)) || slave.behavioralFlaw !== "none")) { - choice.push(`could use some counseling, so ${he} decides to visit ${V.spaName}.`); + choice.push(`could use some counseling, so ${he} <span class="job change">decides to visit ${V.spaName}.</span>`); choice.push(assignJob(slave, "rest in the spa")); } else if (slave.devotion <= 50 && canWalk(slave) && canSee(slave)) { if (V.universalRulesAssignsSelfFacility === 1 && V.servantsQuarters > servQL) { - choice.push(`is obedient but not devoted, so ${he} decides to work from ${V.servantsQuartersName} since it's the least sexually demanding job available.`); + choice.push(`is obedient but not devoted, so ${he} <span class="job change">decides to work from ${V.servantsQuartersName}</span> since it's the least sexually demanding job available.`); choice.push(assignJob(slave, "work as a servant")); } else { - choice.push(`is obedient but not devoted, so ${he} decides to work as a servant since it's the least sexually demanding job available.`); + choice.push(`is obedient but not devoted, so ${he} <span class="job change">decides to work as a servant</span> since it's the least sexually demanding job available.`); choice.push(assignJob(slave, "be a servant")); } } else if (V.universalRulesAssignsSelfFacility === 1 && slave.devotion > 50 && canWalk(slave) && canSee(slave) && V.nurseryNannies > nurseryL && (V.cribs.findIndex((c) => (c.mother === slave.ID || c.father === slave.ID)))) { if (V.cribs.findIndex((c) => (c.mother === slave.ID || c.father === slave.ID))) { - choice.push(`wants to look after ${his} child, so ${he} decides to work in ${V.nurseryName}.`); + choice.push(`wants to look after ${his} child, so ${he} <span class="job change">decides to work in ${V.nurseryName}.</span>`); choice.push(assignJob(slave, "work as a nanny")); } else { // motherly sexualQuirk - choice.push(`enjoys taking care of children, so ${he} decides to work in ${V.nurseryName}.`); + choice.push(`enjoys taking care of children, so ${he} <span class="job change">decides to work in ${V.nurseryName}.</span>`); choice.push(assignJob(slave, "work as a nanny")); } } else if (slave.relationship === -1) { choice.push(`relies on promiscuity to fulfill ${his} emotional needs,`); if (V.cash < 10000) { - choice.push(`and doesn't mind being a whore, so ${he} prostitutes ${himself}`); + choice.push(`and doesn't mind being a whore, <span class="job change">so ${he} prostitutes ${himself}`); if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`in ${V.brothelName}.`); + choice.push(`in ${V.brothelName}.</span>`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`on the streets.`); + choice.push(`on the streets.</span>`); choice.push(assignJob(slave, "whore")); } } else { - choice.push(`so ${he} eagerly decides to slut around`); + choice.push(`so ${he} eagerly <span class="job change">decides to slut around`); if (V.universalRulesAssignsSelfFacility === 1 && V.club > clubL) { - choice.push(`in ${V.clubName}.`); + choice.push(`in ${V.clubName}.</span>`); choice.push(assignJob(slave, "serve in the club")); } else { - choice.push(`on the streets.`); + choice.push(`on the streets.</span>`); choice.push(assignJob(slave, "serve the public")); } slave.sexAmount = 10; @@ -165,50 +165,50 @@ App.SlaveAssignment.choosesOwnJob = (function() { } else if (slave.relationship === -2) { choice.push(`is emotionally bonded to you,`); if (slave.behavioralQuirk === "insecure") { - choice.push(`but insecure, so ${he} decides to make you money by prostituting ${himself}`); + choice.push(`but insecure, so ${he} <span class="job change">decides to make you money by prostituting ${himself}`); if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`in ${V.brothelName}.`); + choice.push(`in ${V.brothelName}.</span>`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`on the streets.`); + choice.push(`on the streets.</span>`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } else if (slave.behavioralQuirk === "advocate") { - choice.push(`and an advocate for slavery, so ${he} decides to burnish your reputation by slutting it up`); + choice.push(`and an advocate for slavery, so ${he} <span class="job change">decides to burnish your reputation by slutting it up`); if (V.universalRulesAssignsSelfFacility === 1 && V.club > clubL) { - choice.push(`in ${V.clubName}.`); + choice.push(`in ${V.clubName}.</span>`); choice.push(assignJob(slave, "serve in the club")); } else { - choice.push(`on the streets.`); + choice.push(`on the streets.</span>`); choice.push(assignJob(slave, "serve the public")); } slave.sexAmount = 10; } else if (slave.energy > 60) { choice.push(`and ${he} thinks of little but sex with you,`); if (V.universalRulesAssignsSelfFacility === 1 && V.masterSuite > masterSL) { - choice.push(`so ${he} heads straight to ${V.masterSuiteName}.`); + choice.push(`so ${he} <span class="job change">heads straight to ${V.masterSuiteName}.</span>`); choice.push(assignJob(slave, "serve in the master suite")); } else { - choice.push(`so ${he} cheerfully designates ${himself} one of your fucktoys.`); + choice.push(`so ${he} cheerfully <span class="job change">designates ${himself} one of your fucktoys.</span>`); choice.push(assignJob(slave, "please you")); } } else if (canSee(slave) && canWalk(slave)) { - choice.push(`so ${he} decides to work`); + choice.push(`so ${he} <span class="job change">decides to work`); if (V.universalRulesAssignsSelfFacility === 1 && V.servantsQuarters > servQL) { - choice.push(`from ${V.servantsQuartersName} to make your penthouse as clean and homelike as possible.`); + choice.push(`from ${V.servantsQuartersName}</span> to make your penthouse as clean and homelike as possible.`); choice.push(assignJob(slave, "work as a servant")); } else { - choice.push(`as a servant to make your penthouse as clean and homelike as possible.`); + choice.push(`as a servant</span> to make your penthouse as clean and homelike as possible.`); choice.push(assignJob(slave, "be a servant")); } } else { choice.push(`but unable to do much on ${his} own,`); if (V.universalRulesAssignsSelfFacility === 1 && V.masterSuite > masterSL) { - choice.push(`so ${he} heads straight to ${V.masterSuiteName} to await your caress.`); + choice.push(`so ${he} <span class="job change">heads straight to ${V.masterSuiteName} to await your caress.</span>`); choice.push(assignJob(slave, "serve in the master suite")); } else { - choice.push(`so ${he} cheerfully designates ${himself} one of your fucktoys to be close to you.`); + choice.push(`so ${he} cheerfully <span class="job change">designates ${himself} one of your fucktoys</span> to be close to you.`); choice.push(assignJob(slave, "please you")); } } @@ -224,122 +224,122 @@ App.SlaveAssignment.choosesOwnJob = (function() { if (slave.energy > 60) { choice.push(`and ${he} thinks of little but sex with you,`); if (V.universalRulesAssignsSelfFacility === 1 && V.masterSuite > masterSL) { - choice.push(`so ${he} heads straight to ${V.masterSuiteName}.`); + choice.push(`so ${he} <span class="job change">heads straight to ${V.masterSuiteName}.</span>`); choice.push(assignJob(slave, "serve in the master suite")); } else { - choice.push(`so ${he} cheerfully designates ${himself} one of your fucktoys.`); + choice.push(`so ${he} cheerfully <span class="job change">designates ${himself} one of your fucktoys.</span>`); choice.push(assignJob(slave, "please you")); } } else if (canSee(slave) && canWalk(slave)) { - choice.push(`so ${he} decides to work`); + choice.push(`so ${he} <span class="job change">decides to work`); if (V.universalRulesAssignsSelfFacility === 1 && V.servantsQuarters > servQL) { - choice.push(`from ${V.servantsQuartersName} to make your penthouse as clean and homelike as possible.`); + choice.push(`from ${V.servantsQuartersName}</span> to make your penthouse as clean and homelike as possible.`); choice.push(assignJob(slave, "work as a servant")); } else { - choice.push(`as a servant to make your penthouse as clean and homelike as possible.`); + choice.push(`as a servant</span> to make your penthouse as clean and homelike as possible.`); choice.push(assignJob(slave, "be a servant")); } } else { choice.push(`but unable to do much on ${his} own`); if (V.universalRulesAssignsSelfFacility === 1 && V.masterSuite > masterSL) { - choice.push(`so ${he} heads straight to ${V.masterSuiteName} to await your caress.`); + choice.push(`so ${he} <span class="job change">heads straight to ${V.masterSuiteName}</span> to await your caress.`); choice.push(assignJob(slave, "serve in the master suite")); } else { - choice.push(`so ${he} cheerfully designates ${himself} one of your fucktoys to be close to you.`); + choice.push(`so ${he} cheerfully <span class="job change">designates ${himself} one of your fucktoys</span> to be close to you.`); choice.push(assignJob(slave, "please you")); } } } else if (slave.devotion < -20) { - choice.push(`and ${he} is scared of you, so ${he} chooses to work as a servant so that ${he} may serve you without "serving" you.`); + choice.push(`and ${he} is scared of you, so ${he} <span class="job change">chooses to work as a servant</span> so that ${he} may serve you without "serving" you.`); choice.push(assignJob(slave, "be a servant")); } else { if (slave.energy > 60) { choice.push(`and ${he} thinks of little but sex,`); if (V.universalRulesAssignsSelfFacility === 1 && V.masterSuite > masterSL) { - choice.push(`so ${he} heads straight to ${V.masterSuiteName}.`); + choice.push(`so ${he} <span class="job change">heads straight to ${V.masterSuiteName}.</span>`); choice.push(assignJob(slave, "serve in the master suite")); } else { - choice.push(`so ${he} cheerfully designates ${himself} one of your fucktoys.`); + choice.push(`so ${he} cheerfully <span class="job change">designates ${himself} one of your fucktoys</span>.`); choice.push(assignJob(slave, "please you")); } } else if (canSee(slave) && canWalk(slave)) { - choice.push(`so ${he} decides to work`); + choice.push(`so ${he} <span class="job change">decides to work`); if (V.universalRulesAssignsSelfFacility === 1 && V.servantsQuarters > servQL) { - choice.push(`from ${V.servantsQuartersName} to make your penthouse as clean and homelike as possible.`); + choice.push(`from ${V.servantsQuartersName}</span> to make your penthouse as clean and homelike as possible.`); choice.push(assignJob(slave, "work as a servant")); } else { - choice.push(`as a servant to make your penthouse as clean and homelike as possible.`); + choice.push(`as a servant</span> to make your penthouse as clean and homelike as possible.`); choice.push(assignJob(slave, "be a servant")); } } else { - choice.push(`but unable to do much on ${his} own, so ${he} designates ${himself} one of your fucktoys to get more intimate with you.`); + choice.push(`but unable to do much on ${his} own, so ${he} <span class="job change">designates ${himself} one of your fucktoys</span> to get more intimate with you.`); choice.push(assignJob(slave, "please you")); } } } else if (slave.fetishKnown === 1 || jsRandom(1, 100) > 5) { // Yes, this segways into other things than fetish. PM - I added a 5% chance for her to not think of something just for flavor. if (slave.fetish === "submissive" && canWalk(slave) && canSee(slave)) { if (V.universalRulesAssignsSelfFacility === 1 && V.servantsQuarters > servQL) { - choice.push(`thinks ${he} belongs at the bottom of the penthouse hierarchy, so ${he} goes to live in ${V.servantsQuartersName}.`); + choice.push(`thinks ${he} belongs at the bottom of the penthouse hierarchy, so ${he} <span class="job change">goes to live in ${V.servantsQuartersName}.</span>`); choice.push(assignJob(slave, "work as a servant")); } else { - choice.push(`thinks ${he} belongs at the bottom of the penthouse hierarchy, so ${he} decides ${he} should be a servant.`); + choice.push(`thinks ${he} belongs at the bottom of the penthouse hierarchy, so ${he} <span class="job change">decides ${he} should be a servant.</span>`); choice.push(assignJob(slave, "be a servant")); } } else if (slave.fetish === "dom" || slave.fetish === "sadist") { if (V.universalRulesAssignsSelfFacility === 1 && V.club > clubL) { - choice.push(`is self-confident, so ${he} decides to work in ${V.clubName}.`); + choice.push(`is self-confident, so ${he} <span class="job change">decides to work in ${V.clubName}.</span>`); choice.push(assignJob(slave, "serve in the club")); } else { - choice.push(`is self-confident, so ${he} decides to work as a public servant.`); + choice.push(`is self-confident, so ${he} <span class="job change">decides to work as a public servant.</span>`); choice.push(assignJob(slave, "serve the public")); } slave.sexAmount = 10; } else if (slave.fetish === "masochist") { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`enjoys abuse, so ${he} hurries down to ${V.brothelName}.`); + choice.push(`enjoys abuse, so ${he} <span class="job change">hurries down to ${V.brothelName}.</span>`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`enjoys abuse, so ${he} decides to become a whore.`); + choice.push(`enjoys abuse, so ${he} <span class="job change">decides to become a whore.</span>`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } else if (slave.fetish === "cumslut") { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`hurries down to ${V.brothelName} to suck cocks.`); + choice.push(`<span class="job change">hurries down to ${V.brothelName}</span> to suck cocks.`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`decides to become a whore, mostly to suck cock.`); + choice.push(`<span class="job change">decides to become a whore,</span> mostly to suck cock.`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } else if (slave.fetish === "humiliation") { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`decides to work in ${V.brothelName}, since it's even more embarrassing to be a whore than a club slut.`); + choice.push(`<span class="job change">decides to work in ${V.brothelName},</span> since it's even more embarrassing to be a whore than a club slut.`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`decides to whore, since it's even more embarrassing to be a whore than to be a public servant.`); + choice.push(`<span class="job change">decides to whore,</span> since it's even more embarrassing to be a whore than to be a public servant.`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } else if (slave.fetish === "buttslut") { if (slave.balls > 0 && slave.prostate > 0 && V.universalRulesAssignsSelfFacility === 1 && V.dairyRestraintsSetting < 2 && V.dairyStimulatorsSetting > 0 && V.dairy > dairyL) { - choice.push(`chooses confinement in ${V.dairyName}, since all ${he} will be expected to do is produce cum by orgasming to buttsex.`); + choice.push(`<span class="job change">chooses confinement in ${V.dairyName},</span> since all ${he} will be expected to do is produce cum by orgasming to buttsex.`); choice.push(assignJob(slave, "work in the dairy")); } else if (canDoAnal(slave)){ if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`decides to work in ${V.brothelName}, since whores get buttfucked more than anyone else.`); + choice.push(`<span class="job change">decides to work in ${V.brothelName},</span> since whores get buttfucked more than anyone else.`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`decides to whore, since whores get buttfucked more than anyone else.`); + choice.push(`<span class="job change">decides to whore,</span> since whores get buttfucked more than anyone else.`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } else { if (V.universalRulesAssignsSelfFacility === 1 && V.club > clubL) { - choice.push(`decides to shake ${his} money maker in ${V.clubName}.`); + choice.push(`<span class="job change">decides to shake ${his} money maker in ${V.clubName}.</span>`); choice.push(assignJob(slave, "serve in the club")); } else { - choice.push(`decides to shake ${his} money maker on the streets.`); + choice.push(`<span class="job change">decides to shake ${his} money maker on the streets.</span>`); choice.push(assignJob(slave, "serve the public")); } slave.sexAmount = 10; @@ -347,78 +347,78 @@ App.SlaveAssignment.choosesOwnJob = (function() { } else if (slave.fetish === "pregnancy") { if (V.PC.dick > 0 && isFertile(slave)) { if (V.universalRulesAssignsSelfFacility === 1 && V.masterSuite > masterSL) { - choice.push(`decides to serve you in ${V.masterSuiteName}, hoping that you'll get ${him} pregnant.`); + choice.push(`<span class="job change">decides to serve you in ${V.masterSuiteName},</span> hoping that you'll get ${him} pregnant.`); choice.push(assignJob(slave, "serve in the master suite")); } else { - choice.push(`decides to be your fucktoy, hoping that you'll get ${him} pregnant.`); + choice.push(`<span class="job change">decides to be your fucktoy,</span> hoping that you'll get ${him} pregnant.`); choice.push(assignJob(slave, "please you")); } } else if (V.universalRulesAssignsSelfFacility === 1 && V.dairyPregSetting > 0 && V.dairy > dairyL && isFertile(slave)) { if (V.dairyPregSetting > 1) { - choice.push(`eagerly rushes to ${V.dairyName} in the hopes that ${his} fertile womb will be packed full of children.`); + choice.push(`eagerly <span class="job change">rushes to ${V.dairyName}</span> in the hopes that ${his} fertile womb will be packed full of children.`); choice.push(assignJob(slave, "work in the dairy")); } else { - choice.push(`rushes to ${V.dairyName} in the hopes that ${his} fertile womb will be rented out.`); + choice.push(`<span class="job change">rushes to ${V.dairyName}</span> in the hopes that ${his} fertile womb will be rented out.`); choice.push(assignJob(slave, "work in the dairy")); } } else if (slave.bellyPreg >= 1500) { if (arcology.FSRepopulationFocus > 20) { if (V.cash < 10000) { if (V.brothel > brothelL && V.universalRulesAssignsSelfFacility === 1) { - choice.push(`heads to ${V.brothelName} since ${he} wants to set an example for any unimpregnated girls.`); + choice.push(`<span class="job change">heads to ${V.brothelName}</span> since ${he} wants to set an example for any unimpregnated girls.`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`heads to the streets to lavish in the attention given to pregnant prostitutes.`); + choice.push(`<span class="job change">heads to the streets</span> to lavish in the attention given to pregnant prostitutes.`); choice.push(assignJob(slave, "whore")); } } else { if (V.club > clubL && V.universalRulesAssignsSelfFacility === 1) { - choice.push(`heads to ${V.clubName} to show off ${his} growing middle and lavish in the public's attention.`); + choice.push(`<span class="job change">heads to ${V.clubName}</span> to show off ${his} growing middle and lavish in the public's attention.`); choice.push(assignJob(slave, "serve in the club")); } else { - choice.push(`heads to the streets to contribute to the number of visibly pregnant women around.`); + choice.push(`<span class="job change">heads to the streets</span> to contribute to the number of visibly pregnant women around.`); choice.push(assignJob(slave, "serve the public")); } } slave.sexAmount = 10; } else if (V.masterSuite > masterSL && V.universalRulesAssignsSelfFacility === 1) { - choice.push(`heads straight to ${V.masterSuiteName} to share the intimacy of ${his} pregnant body with you.`); + choice.push(`<span class="job change">heads straight to ${V.masterSuiteName}</span> to share the intimacy of ${his} pregnant body with you.`); choice.push(assignJob(slave, "serve in the master suite")); } else { - choice.push(`decides to be your fucktoy to share the intimacy of ${his} pregnant body with you.`); + choice.push(`<span class="job change">decides to be your fucktoy</span> to share the intimacy of ${his} pregnant body with you.`); choice.push(assignJob(slave, "please you")); } } else if (slave.pregKnown === 1) { if (V.masterSuite > masterSL && V.universalRulesAssignsSelfFacility === 1) { - choice.push(`heads straight to ${V.masterSuiteName} so you may watch for the day that ${he} finally starts to show.`); + choice.push(`<span class="job change">heads straight to ${V.masterSuiteName}</span> so you may watch for the day that ${he} finally starts to show.`); choice.push(assignJob(slave, "serve in the master suite")); } else { - choice.push(`decides to be your fucktoy so you may enjoy watching ${him} begin showing.`); + choice.push(`<span class="job change">decides to be your fucktoy</span> so you may enjoy watching ${him} begin showing.`); choice.push(assignJob(slave, "please you")); } } else if (canGetPregnant(slave)) { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`can't indulge ${his} pregnancy fetish without getting dicked, so ${he} heads down to ${V.brothelName} to do just that.`); + choice.push(`can't indulge ${his} pregnancy fetish without getting dicked, so ${he} <span class="job change">heads down to ${V.brothelName}</span> to do just that.`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`can't indulge ${his} pregnancy fetish without getting dicked, so ${he} decides to be a whore to get seeded.`); + choice.push(`can't indulge ${his} pregnancy fetish without getting dicked, so ${he} <span class="job change">decides to be a whore</span> to get seeded.`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } else if (slave.lactation > 0) { if (V.universalRulesAssignsSelfFacility === 1 && V.dairyRestraintsSetting < 2 && V.dairy > dairyL) { - choice.push(`heads down to ${V.dairyName} to be around other lactating girls.`); + choice.push(`<span class="job change">heads down to ${V.dairyName}</span> to be around other lactating girls.`); choice.push(assignJob(slave, "work in the dairy")); } else { - choice.push(`decides to get milked, since ${he} is already lactating.`); + choice.push(`<span class="job change">decides to get milked,</span> since ${he} is already lactating.`); choice.push(assignJob(slave, "get milked")); } } else { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`can't indulge ${his} fetish by getting pregnant ${himself}, so ${he} just heads down to ${V.brothelName}.`); + choice.push(`can't indulge ${his} fetish by getting pregnant ${himself}, so ${he} just <span class="job change">heads down to ${V.brothelName}.</span>`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`can't indulge ${his} fetish by getting pregnant ${himself}, so ${he} glumly decides to be a whore.`); + choice.push(`can't indulge ${his} fetish by getting pregnant ${himself}, so ${he} glumly <span class="job change">decides to be a whore.</span>`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; @@ -426,144 +426,144 @@ App.SlaveAssignment.choosesOwnJob = (function() { } else if (slave.fetish === "boobs") { if (slave.lactation > 0) { if (V.universalRulesAssignsSelfFacility === 1 && V.dairyRestraintsSetting < 2 && V.dairy > dairyL) { - choice.push(`heads down to ${V.dairyName} for all the attention that'll be lavished on ${his} nipples.`); + choice.push(`<span class="job change">heads down to ${V.dairyName}</span> for all the attention that'll be lavished on ${his} nipples.`); choice.push(assignJob(slave, "work in the dairy")); } else { - choice.push(`decides to get milked, since ${he} loves getting off to it.`); + choice.push(`<span class="job change">decides to get milked,</span> since ${he} loves getting off to it.`); choice.push(assignJob(slave, "get milked")); } } else if (V.universalRulesAssignsSelfFacility === 1 && V.club > clubL) { - choice.push(`decides to work in ${V.clubName} so ${he} can show off ${his} bare breasts.`); + choice.push(`<span class="job change">decides to work in ${V.clubName}</span> so ${he} can show off ${his} bare breasts.`); choice.push(assignJob(slave, "serve in the club")); slave.sexAmount = 10; } else { - choice.push(`decides to work as a public servant so ${he} can show off ${his} bare breasts.`); + choice.push(`<span class="job change">decides to work as a public servant</span> so ${he} can show off ${his} bare breasts.`); choice.push(assignJob(slave, "serve the public")); slave.sexAmount = 10; } } else if (slave.attrXX > 85) { if (V.universalRulesAssignsSelfFacility === 1 && V.club > clubL) { - choice.push(`decides to work in ${V.clubName} so ${he} can hit on hot girls.`); + choice.push(`<span class="job change">decides to work in ${V.clubName}</span> so ${he} can hit on hot girls.`); choice.push(assignJob(slave, "serve in the club")); } else { - choice.push(`decides to work as a public servant so ${he} can hit on hot girls.`); + choice.push(`<span class="job change">decides to work as a public servant</span> so ${he} can hit on hot girls.`); choice.push(assignJob(slave, "serve the public")); } slave.sexAmount = 10; } else if (slave.attrXY > 85) { if (V.universalRulesAssignsSelfFacility === 1 && V.club > clubL) { - choice.push(`decides to work in ${V.clubName} so ${he} can hit on cute boys.`); + choice.push(`<span class="job change">decides to work in ${V.clubName}</span> so ${he} can hit on cute boys.`); choice.push(assignJob(slave, "serve in the club")); } else { - choice.push(`decides to work as a public servant so ${he} can hit on cute boys.`); + choice.push(`<span class="job change">decides to work as a public servant</span> so ${he} can hit on cute boys.`); choice.push(assignJob(slave, "serve the public")); } slave.sexAmount = 10; } else if (slave.energy > 95) { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`decides to help those of your slaves who mind taking dick all day by working in ${V.brothelName}.`); + choice.push(`<span class="job change">decides to help those of your slaves who mind taking dick all day by working in ${V.brothelName}.</span>`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`decides to help those of your slaves who mind taking dick all day by working as a whore.`); + choice.push(`<span class="job change">decides to help those of your slaves who mind taking dick all day by working as a whore.</span>`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } else if (arcology.FSChattelReligionist > 0) { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`is a pure and faithful slave, so ${he} sells ${his} body in the holy brothel.`); + choice.push(`is a pure and faithful slave, <span class="job change">so ${he} sells ${his} body in the holy brothel.</span>`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`is a pure and faithful slave, so ${he} sells ${his} body as a holy prostitute.`); + choice.push(`is a pure and faithful slave, <span class="job change">so ${he} sells ${his} body as a holy prostitute.</span>`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } else if (arcology.FSEgyptianRevivalist > 0) { if (V.universalRulesAssignsSelfFacility === 1 && V.masterSuite > masterSL) { - choice.push(`is a devoted slave, so ${he} immediately joins your harem.`); + choice.push(`is a devoted slave, <span class="job change">so ${he} immediately joins your harem.</span>`); choice.push(assignJob(slave, "serve in the master suite")); } else { - choice.push(`is a devoted slave, so ${he} immediately joins your harem.`); + choice.push(`is a devoted slave, <span class="job change">so ${he} immediately joins your harem.</span>`); choice.push(assignJob(slave, "please you")); } } else if (arcology.FSRomanRevivalist > 0) { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`is a devoted slave, so ${he} decides ${he} can best serve the state by raising money for the treasury, by selling ${his} body in ${V.brothelName}.`); + choice.push(`is a devoted slave, so ${he} <span class="job change">decides ${he} can best serve the state by raising money for the treasury, by selling ${his} body in ${V.brothelName}.</span>`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`is a devoted slave, so ${he} decides ${he} can best serve the state by raising money for the treasury, by selling ${his} body as a prostitute.`); + choice.push(`is a devoted slave, so ${he} <span class="job change">decides ${he} can best serve the state by raising money for the treasury, by selling ${his} body as a prostitute.</span>`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } else if (arcology.FSAztecRevivalist > 0) { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`is a devoted slave, so ${he} decides ${he} can best serve the empire by serving at the fertility temple.`); + choice.push(`is a devoted slave, so ${he} <span class="job change">decides ${he} can best serve the empire by serving at the fertility temple.</span>`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`is a devoted slave, so ${he} decides ${he} can best serve the empire by offering ${himself} to the public.`); + choice.push(`is a devoted slave, so ${he} <span class="job change">decides ${he} can best serve the empire by offering ${himself} to the public.</span>`); choice.push(assignJob(slave, "serve the public")); } slave.sexAmount = 10; } else if (arcology.FSPaternalist > 0) { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`decides to work in ${V.brothelName}, a respectable position for a slave in this enlightened arcology.`); + choice.push(`<span class="job change">decides to work in ${V.brothelName},</span> a respectable position for a slave in this enlightened arcology.`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`decides to be a whore, a respectable position for a slave in this enlightened arcology.`); + choice.push(`<span class="job change">decides to be a whore,</span> a respectable position for a slave in this enlightened arcology.`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } else if (arcology.FSPastoralist > 0) { if (slave.lactation > 0) { if (V.universalRulesAssignsSelfFacility === 1 && V.dairyRestraintsSetting < 2 && V.dairy > dairyL) { - choice.push(`hurries to join your herd of dairy cows.`); + choice.push(`<span class="job change">hurries to join your herd of dairy cows.</span>`); choice.push(assignJob(slave, "work in the dairy")); } else { - choice.push(`hurries to join your herd of cows.`); + choice.push(`<span class="job change">hurries to join your herd of cows.</span>`); choice.push(assignJob(slave, "get milked")); } } else { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`decides to work in ${V.brothelName} to help raise money to get more girls lactating properly.`); + choice.push(`<span class="job change">decides to work in ${V.brothelName}</span> to help raise money to get more girls lactating properly.`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`decides to prostitute ${himself} to help raise money to get more girls lactating properly.`); + choice.push(`<span class="job change">decides to prostitute ${himself}</span> to help raise money to get more girls lactating properly.`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } } else if (arcology.FSHedonisticDecadence > 0) { if (V.universalRulesAssignsSelfFacility === 1 && V.spa > spaL && (slave.trust < 60 || slave.devotion <= 60)) { - choice.push(`could use a break, so ${he} heads to take a dip in the spa.`); + choice.push(`could use a break, so ${he} <span class="job change">heads to take a dip in the spa.</span>`); choice.push(assignJob(slave, "rest in the spa")); } else { - choice.push(`could use a meal and a nap, so ${he} grabs a cup of food and heads to bed.`); + choice.push(`could use a meal and a nap, so ${he} grabs a cup of food and <span class="job change">heads to bed.</span>`); choice.push(removeJob(slave, slave.assignment)); } } else { if (slave.skill.whoring > slave.skill.entertainment) { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`decides to work in ${V.brothelName}, since ${he} thinks ${himself} a better whore than a public slut.`); + choice.push(`<span class="job change">decides to work in ${V.brothelName},</span> since ${he} thinks ${himself} a better whore than a public slut.`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`decides to whore, since ${he} thinks ${himself} a better whore than a public slut.`); + choice.push(`<span class="job change">decides to whore,</span> since ${he} thinks ${himself} a better whore than a public slut.`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; } else if (slave.skill.entertainment > slave.skill.whoring) { if (V.universalRulesAssignsSelfFacility === 1 && V.club > clubL) { - choice.push(`decides to be a club ${girl}, since ${he} thinks ${himself} a better public slut than a whore.`); + choice.push(`<span class="job change">decides to be a club ${girl},</span> since ${he} thinks ${himself} a better public slut than a whore.`); choice.push(assignJob(slave, "serve in the club")); } else { - choice.push(`decides to serve the public, since ${he} thinks ${himself} a better public slut than a whore.`); + choice.push(`<span class="job change">decides to serve the public,</span> since ${he} thinks ${himself} a better public slut than a whore.`); choice.push(assignJob(slave, "serve the public")); } slave.sexAmount = 10; } else { if (V.universalRulesAssignsSelfFacility === 1 && V.brothel > brothelL) { - choice.push(`decides to join ${his} sisters and work in ${V.brothelName}.`); + choice.push(`<span class="job change">decides to join ${his} sisters and work in ${V.brothelName}.</span>`); choice.push(assignJob(slave, "work in the brothel")); } else { - choice.push(`decides to prostitute ${himself} to help you upgrade ${arcology.name} and improve everyone's life.`); + choice.push(`<span class="job change">decides to prostitute ${himself}</span> to help you upgrade ${arcology.name} and improve everyone's life.`); choice.push(assignJob(slave, "whore")); } slave.sexAmount = 10; @@ -571,14 +571,14 @@ App.SlaveAssignment.choosesOwnJob = (function() { } } else { if (V.universalRulesAssignsSelfFacility === 1 && V.club > clubL) { - choice.push(`decides to be a club ${girl}, since partying is better than sitting around and failing to think of a job to do.`); + choice.push(`<span class="job change">decides to be a club ${girl},</span> since partying is better than sitting around and failing to think of a job to do.`); choice.push(assignJob(slave, "serve in the club")); slave.sexAmount = 10; } else if (canWalk(slave) && canSee(slave)) { - choice.push(`decides to tidy up the penthouse a little while ${he} thinks.`); + choice.push(`<span class="job change">decides to tidy up the penthouse</span> a little while ${he} thinks.`); choice.push(assignJob(slave, "be a servant")); } else { - choice.push(`stays in bed, unable to come up with anything.`); + choice.push(`<span class="job change">stays in bed,</span> unable to come up with anything.`); choice.push(removeJob(slave, slave.assignment)); } } diff --git a/src/endWeek/saRecruitGirls.js b/src/endWeek/saRecruitGirls.js index 2815560f3a779593e31196a055cf500cda8f0ee2..db0ef59f980a12587741d0a909b991e40549f47e 100644 --- a/src/endWeek/saRecruitGirls.js +++ b/src/endWeek/saRecruitGirls.js @@ -597,14 +597,14 @@ App.SlaveAssignment.recruitGirls = (function() { } else if (arcology.FSHedonisticDecadence !== "unset") { if (targetArcology.FSHedonisticDecadence !== "unset") { r.push(`${He} advances Hedonistic Decadence there by stuffing ${his} face at all times, having one hand down ${his} pants, and inviting anyone near ${him} for a quick fuck whenever the mood strikes ${him}.`); - if (["abusive", "anal addict", "attention whore", "breast growth", "breeder", "cum addict", "malicious", "neglectful", "self hating"].includes(slave.sexualFlaw)) { + if (App.Data.misc.paraphiliaList.includes(slave.sexualFlaw)) { r.push(`${He} wears ${his} sexual paraphilia proudly and makes sure everyone knows what ${he} likes and how ${he} likes it.`); targetArcology.FSHedonisticDecadence++; } targetArcology.FSHedonisticDecadence += influence; } else if (targetArcology.FSPhysicalIdealist !== "unset") { r.push(`${He} challenges Physical Idealism there by stuffing ${his} face at all times, having one hand down ${his} pants, and inviting anyone near ${him} for a quick fuck whenever the mood strikes ${him}.`); - if (["abusive", "anal addict", "attention whore", "breast growth", "breeder", "cum addict", "malicious", "neglectful", "self hating"].includes(slave.sexualFlaw)) { + if (App.Data.misc.paraphiliaList.includes(slave.sexualFlaw)) { r.push(`${He} wears ${his} sexual paraphilia proudly and make sure everyone knows what ${he} likes and how ${he} likes it.`); targetArcology.FSPhysicalIdealist--; } diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js index 261705930f3d4eba2e857d065b91fc87a3441e22..56735a0988f32f85be497ab41974f99ae4d9b3a0 100644 --- a/src/endWeek/saServeThePublic.js +++ b/src/endWeek/saServeThePublic.js @@ -167,7 +167,7 @@ App.SlaveAssignment.serveThePublic = (function() { } } if (V.DJignoresFlaws !== 1) { - if (!["abusive", "anal addict", "attention whore", "breast growth", "breeder", "cum addict", "malicious", "neglectful", "none", "self hating"].includes(slave.sexualFlaw) && jsRandom(1, 100) > 90) { + if (!App.Data.misc.paraphiliaList.includes(slave.sexualFlaw) && slave.sexualFlaw !== "none" && jsRandom(1, 100) > 90) { r += ` ${SlaveFullName(S.DJ)} manages to <span class="flaw break">break</span> ${slave.slaveName} of ${his} sexual flaws.`; slave.sexualFlaw = "none"; } else if (slave.behavioralFlaw !== "none" && jsRandom(1, 100) > 90) { diff --git a/src/endWeek/saSocialEffects.js b/src/endWeek/saSocialEffects.js index 443086463102615886df3ea4f254d2531ea9ee24..1137eda8fc89e28ef904f724443038d1d3ebe3cb 100644 --- a/src/endWeek/saSocialEffects.js +++ b/src/endWeek/saSocialEffects.js @@ -818,7 +818,7 @@ App.SlaveAssignment.saSocialEffects = function(slave) { if (["a burqa", "a chattel habit", "a fallen nuns habit", "a hijab and abaya", "a niqab and abaya", "a penitent nuns habit", "a succubus outfit"].includes(slave.clothes)) { t.push(new SocialEffect("ChattelReligionist", 1, `Religious clothing`, `Society <span class="green">approves</span> of ${his} religiously themed clothing, strengthening the connection between sexual servitude and faith.`)); - } else if (["a bunny outfit", "a hijab and blouse", "a huipil", "a kimono", "a military uniform", "a nice maid outfit", "a nice nurse outfit", "a skimpy loincloth", "a slutty qipao", "a toga", "body oil", "chains", "conservative clothing", "nice business attire", "no clothing", "shibari ropes", "uncomfortable straps"].includes(slave.clothes)) { + } else if (["a bunny outfit", "a hijab and blouse", "a huipil", "a kimono", "a military uniform", "a nice maid outfit", "a nice nurse outfit", "a skimpy loincloth", "a slutty qipao", "a toga", "Imperial Plate", "a tight Imperial bodysuit", "body oil", "chains", "conservative clothing", "nice business attire", "no clothing", "shibari ropes", "uncomfortable straps"].includes(slave.clothes)) { t.push(new SocialEffect("ChattelReligionist", 0, `Spartan clothing`, `Society accepts ${his} spartan clothing, seeing it as permissible under the new religious mores.`)); } else if (slave.fuckdoll === 0) { diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js index 67f32fa4e960a8a0bf19419d577ab89ab7ed6e31..dcc918d5b55c994ab7f3f903024a63b1f80b8bee 100644 --- a/src/endWeek/saWhore.js +++ b/src/endWeek/saWhore.js @@ -206,7 +206,7 @@ App.SlaveAssignment.whore = (function() { r += ` Unfortunately, ${his} inability to hear wastes most of ${madam.slaveName}'s advice.`; } if (V.MadamIgnoresFlaws !== 1) { - if (!["abusive", "anal addict", "attention whore", "breast growth", "breeder", "cum addict", "malicious", "neglectful", "none", "self hating"].includes(slave.sexualFlaw) && jsRandom(1, 100) > 90) { + if (!App.Data.misc.paraphiliaList.includes(slave.sexualFlaw) && slave.sexualFlaw !== "none" && jsRandom(1, 100) > 90) { r += ` ${SlaveFullName(madam)} manages to <span class="flaw break">break</span> ${slave.slaveName} of ${his} sexual flaws.`; slave.sexualFlaw = "none"; } else if (slave.behavioralFlaw !== "none" && jsRandom(1, 100) > 90) { diff --git a/src/endWeek/slaveAssignmentReport.js b/src/endWeek/slaveAssignmentReport.js index 6e2c5ba860109411a735b2d8b68d9feb4e9a7e2f..ae7220bd60721c1f53d29463e153c8e261b7436c 100644 --- a/src/endWeek/slaveAssignmentReport.js +++ b/src/endWeek/slaveAssignmentReport.js @@ -232,71 +232,6 @@ App.EndWeek.slaveAssignmentReport = function() { } } - if (S.HeadGirl) { - /** @type {FC.HeadGirlTrainee[][]} */ - const HGPossibleSlaves = [[], [], [], [], [], []]; - for (const slave of V.slaves) { - if (!assignmentVisible(slave) || slave.fuckdoll === 1 || slave.ID === V.BodyguardID || slave.ID === V.HeadGirlID || slave.fetish === "mindbroken") { - continue; - } else if (Array.isArray(V.personalAttention) && V.personalAttention.some(p => p.ID === slave.ID)) { - continue; - } - - if (V.headGirlTrainsHealth && slave.health.condition < -20) { - HGPossibleSlaves[0].push({ID: slave.ID, training: "health"}); - continue; - } - - if (slave.health.tired < 50) { - const hasParaphilia = (["abusive", "anal addict", "attention whore", "breast growth", "breeder", "cum addict", "malicious", "neglectful", "self hating"].includes(slave.sexualFlaw)); - if (V.headGirlTrainsParaphilias && hasParaphilia) { - HGPossibleSlaves[1].push({ID: slave.ID, training: "paraphilia"}); - continue; - } - - if (V.headGirlTrainsFlaws || V.headGirlSoftensFlaws) { - if (slave.behavioralFlaw !== "none" || (slave.sexualFlaw !== "none" && !hasParaphilia)) { - if (V.headGirlSoftensFlaws) { - if (slave.devotion > 20) { - if ((slave.behavioralFlaw !== "none" && slave.behavioralQuirk === "none") || (slave.sexualFlaw !== "none" && slave.sexualQuirk === "none" && !hasParaphilia)) { - HGPossibleSlaves[3].push({ID: slave.ID, training: "soften"}); - } else { - HGPossibleSlaves[3].push({ID: slave.ID, training: "flaw"}); - } - continue; - } - } else if (V.headGirlTrainsFlaws) { - HGPossibleSlaves[2].push({ID: slave.ID, training: "flaw"}); - continue; - } - } - } - - if (V.headGirlTrainsObedience && slave.devotion <= 20 && slave.trust >= -20) { - HGPossibleSlaves[4].push({ID: slave.ID, training: "obedience"}); - continue; - } - - if (V.headGirlTrainsSkills) { - if (slave.skill.oral < S.HeadGirl.skill.oral) { - HGPossibleSlaves[5].push({ID: slave.ID, training: "oral skill"}); - } else if ((slave.skill.vaginal < S.HeadGirl.skill.vaginal) && (slave.vagina > 0) && (canDoVaginal(slave))) { - HGPossibleSlaves[5].push({ID: slave.ID, training: "fuck skill"}); - } else if ((slave.skill.anal < S.HeadGirl.skill.anal) && (slave.anus > 0) && (canDoAnal(slave))) { - HGPossibleSlaves[5].push({ID: slave.ID, training: "anal skill"}); - } else if (slave.skill.whoring < S.HeadGirl.skill.whoring) { - HGPossibleSlaves[5].push({ID: slave.ID, training: "whore skill"}); - } else if ((slave.skill.entertainment < S.HeadGirl.skill.entertainment) && !isAmputee(slave)) { - HGPossibleSlaves[5].push({ID: slave.ID, training: "entertain skill"}); - } - } - } - } - V.HGTrainSlavesIDs = HGPossibleSlaves.flatten().slice(0, App.EndWeek.saVars.HGEnergy); - } else { - V.HGTrainSlavesIDs = []; - } - /** * Accordion * @version 0.7RC diff --git a/src/events/RETS/reFucktoyPrefersRelative.js b/src/events/RETS/reFucktoyPrefersRelative.js new file mode 100644 index 0000000000000000000000000000000000000000..b6eec0a389e9583d61fc886c7622731eff587ca6 --- /dev/null +++ b/src/events/RETS/reFucktoyPrefersRelative.js @@ -0,0 +1,321 @@ +App.Events.RETSFucktoyPrefersRelative = class RETSFucktoyPrefersRelative extends App.Events.BaseEvent { + eventPrerequisites() { + return [ + () => V.seeIncest > 0, + ]; + } + + actorPrerequisites() { + return [ + [ // event slave + s => s.fetish !== "mindbroken", + s => s.devotion > 20, + s => s.relationship > -2, // ebonded and lower always prefer PC + s => s.trust < 95, // perfectly trusting prefer PC + s => [Job.CONCUBINE, Job.MASTERSUITE, Job.FUCKTOY].includes(s.assignment), // is assigned to fuck you + s => !["either", V.PC.genes].includes(RETSFucktoyPrefersRelative.preferredSex(s)), // but swings the other way + s => s.energy > 40, // scene assumes horniness...professionals might feel the same way, but you'd never know + ], + [ // and a relative that they prefer over you + s => s.fetish !== "mindbroken", + s => s.genes === RETSFucktoyPrefersRelative.preferredSex(getSlave(this.actors[0])), + s => areRelated(s, getSlave(this.actors[0])), + isSlaveAvailable + ] + ]; + } + + /** Return the preferred sex for this slave's partners + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ + static preferredSex(slave) { + if (slave.attrXX > (slave.attrXY + 5)) { + return "XX"; + } else if (slave.attrXY > (slave.attrXX + 5)) { + return "XY"; + } + return "either"; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + const [fucktoy, relative] = this.actors.map(a => getSlave(a)); + const { + He, he, His, his, him + } = getPronouns(fucktoy); + const { + He2, he2, His2, his2, him2, girl2, women2 + } = getPronouns(relative).appendSuffix("2"); + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, [fucktoy, relative], "no clothing"); + + let fuckhole = fucktoy.toyHole; + if (fuckhole === "all her holes") { + if (canDoVaginal(fucktoy)) { + fuckhole = "pussy"; + } else if (canDoAnal(fucktoy)) { + fuckhole = "ass"; + } else { + fuckhole = "mouth"; + } + } + + let t = []; + t.push(`You're enjoying`, contextualIntro(V.PC, fucktoy, "DOM"), `one evening in your office when`, contextualIntro(fucktoy, relative, "DOM"), `passes by stark naked (probably on ${his2} way to or from the shower). The glass walls of your office are designed to let you, and by extension everyone else inside, clearly see everything that happens in the rest of the Penthouse, and the comings and goings of all your slaves.`); + App.Events.addParagraph(node, t); + + t = []; + t.push(`In this case, that means ${fucktoy.slaveName} gets an eyeful of ${relative.slaveName} as ${he2} walks by. ${He} is a well-disciplined slave and ${his} reaction might have passed unnoticed if you weren't`); + switch (fuckhole) { + case "pussy": + if (V.PC.dick > 0) { + t.push(`deep inside ${his} pussy. You feel ${his} walls pulse and contract around you as ${he} cums hard.`); + } else { + t.push(`thrusting a strapon deep into ${his} pussy. You pause your thrusts as ${he} gasps and twitches, cumming hard.`); + } + break; + case "ass": + if (V.PC.dick > 0) { + t.push(`deep inside ${his} ass. You feel ${his} sphincter contract around you as ${he} cums hard.`); + } else { + t.push(`thrusting a strapon deep into ${his} ass. You pause your thrusts as ${he} gasps and twitches, cumming hard.`); + } + break; + case "mouth": + if (V.PC.dick > 0) { + t.push(`buried deep in ${his} throat. ${His} motions waver and you feel ${his} throat contract around you as ${he} cums hard.`); + } else { + t.push(`thrusting a strapon deep into ${his} throat. ${His} motions waver as ${he} twitches, cumming hard.`); + } + break; + case "boobs": + if (V.PC.dick > 0) { + t.push(`receiving a boobjob from ${him}. ${His} motions waver and ${he} gasps aloud as ${he} cums hard.`); + } else { + t.push(`groping ${his} boobs. ${He} gasps and twitches, cumming hard.`); + } + break; + case "dick": + t.push(`riding ${him}. ${He} groans as ${he} unexpectedly cums hard, filling you up.`); + if (canImpreg(V.PC, fucktoy)) { + t.push(`You wonder briefly if ${he} might have just gotten you pregnant.`); + knockMeUp(V.PC, 5, 2, fucktoy.ID); + } + break; + default: + throw `Unexpected toyhole ${fuckhole}`; + } + t.push(`You have a lot of experience with slaves getting off, and you're pretty sure that reaction wasn't just from your use of ${him}, but from ogling the nude form of ${relative.slaveName} at the same time.`); + App.Events.addParagraph(node, t); + + t = []; + t.push(`You decide to test your fucktoy, and ask ${him} directly whether ${he} was turned on by ${his} ${relativeTerm(fucktoy, relative)} ${relative.slaveName}.`); + if (fucktoy.trust < 0) { // illusion of choice...he'll always tell you, just for a different reason + t.push(`${He} knows better than to lie to you, and replies, terrified, that ${he} was.`); + } else { + t.push(`${He} trusts you enough to tell you the truth without reservation, and replies that ${he} was.`); + } + App.Events.addParagraph(node, t); + + t = []; + t.push(`Pushing further, you ask ${him} what turns ${him} on so much about ${relative.slaveName} that ${he}'d cum from looking at ${him2} but not from looking at you.`); + t.push(`Knowing that it's a potentially dangerous answer, but unwilling to lie to you, ${he} responds`); + if (!canTalk(fucktoy)) { + t.push(`with nervous gestures, indicating that`); + } else { + t.push(`nervously that`); + } + t.push(`${he} loves ${his} ${relativeTerm(fucktoy, relative)}, and besides,`); + if (RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XX") { // likes women + if (relative.vagina > -1 && V.PC.vagina === -1) { + t.push(`${he2} has a pretty pussy, and you don't.`); + } else if (relative.boobs > 300 && V.PC.boobs < 300) { + t.push(`${he2} has great tits, and you don't.`); + } else if (relative.boobs > V.PC.boobs * 1.2) { + t.push(`${he2} has way bigger tits than you do.`); + } else { + t.push(`${he2}'s a woman, and you aren't.`); // meh + } + } else { // likes men + if (relative.dick > V.PC.dick) { + if (V.PC.dick === 0) { + t.push(`${he2} has a cock, and ${he} loves cocks.`); + } else { + t.push(`${he2} has a bigger cock than you do.`); + } + } else if (relative.balls > 0 && V.PC.balls === 0) { + t.push(`${he2} has balls, and you don't.`); + } else if (relative.boobs === 0 && V.PC.boobs >= 300) { + t.push(`${he2} has a manly, muscular chest.`); + } else { + t.push(`${he2}'s a man, and you aren't.`); // meh + } + } + App.Events.addParagraph(node, t); + + t = []; + t.push(`You consider this for a moment...it's objectively a true difference between you and ${relative.slaveName}, and that reason lines up with what you ${fucktoy.attrKnown ? "know" : "have guessed"} about ${his} sexuality already.`); + if (App.Utils.sexAllowed(fucktoy, relative)) { + t.push(`In fact, you're pretty sure you've seen the two of them specifically going at it fairly vigorously before.`); + } + t.push(`${His} higher attraction to ${women2} isn't necessarily a problem...${he}'s been plenty attentive to your sexual needs even if ${he}'s not necessarily turned on by your body...but at the same time, you could probably do something about it if you wanted.`); + fucktoy.attrKnown = 1; // now you know + App.Events.addParagraph(node, t); + + App.Events.addResponses(node, [ + new App.Events.Result(`Punish ${him}`, punish), + new App.Events.Result(`Condition ${him} to appreciate ${RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XX" ? "men" : "women"}`, condition), + new App.Events.Result(`Call ${relative.slaveName} back and have a threesome`, threesome), + ]); + + function punish() { + const frag = document.createDocumentFragment(); + t = []; + t.push(`You push ${fucktoy.slaveName} face-down over your desk and sternly inform that ${he} has only one objective when serving as your fucktoy: bringing you pleasure. To punctuate each phrase, you strike ${his} buttocks with your hand, leaving a red mark. ${He} is not to be distracted when a ${girl2} ${he} likes walks by, or when you get a call, or for any other reason unless you specifically tell ${him} to stop. And ${he} is certainly not allowed to cum before you without permission.`); + App.Events.addParagraph(frag, t); + + t = []; + t.push(`${He} meekly acknowledges your instructions and <span class="devotion inc">vows to do better</span> for you, and you can tell that ${he} <span class="trust dec">fears</span> a repeat of this lesson.`); + fucktoy.devotion += 4; + fucktoy.trust -= 4; + if (fucktoy.fetish === "submissive" && fucktoy.fetishKnown === 1) { + t.push(`Still, when you glance down, you catch the faintest hint of a smile; it seems your punishment appealed to him, <span class="fetish inc">reinforcing ${his} submission</span> to your will.`); + fucktoy.fetishStrength += 10; + } else { + t.push(`${His} suppression of ${his} attraction naturally leads to a <span class="stat drop">decrease in ${his} libido</span> and <span class="stat drop">attraction to ${women2}.</span>`); + fucktoy.energy -= 3; + if (RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XX") { + fucktoy.attrXX -= 5; + } else { + fucktoy.attrXY -= 5; + } + } + App.Events.addParagraph(frag, t); + + if (V.arcologies[0].FSSlaveProfessionalism !== "unset") { + t = []; + t.push(`Whispers spread through your arcology about how seriously you take your slaves' <span class="reputation inc">duty to professional detachment.</span>`); + FutureSocieties.Change("SlaveProfessionalism", 3); + App.Events.addParagraph(frag, t); + } + + return [frag]; + } + + function condition() { + const {himA} = getPronouns(assistant.pronouns().main).appendSuffix('A'); + t = []; + t.push(`While ${fucktoy.slaveName} kneels before you, ready to resume ${his} service to you, you inform ${him} that ${he}'ll get some help to see things the right way. You summon ${V.assistant.name} and instruct ${himA} to begin a conditioning regimen to encourage ${fucktoy.slaveName} to engage sexually with`); + if (RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XX") { + t.push(`<span class="improvement">men rather than women.</span>`); + fucktoy.attrXX -= 10; + fucktoy.attrXY += 15; + } else { + t.push(`<span class="improvement">women rather than men.</span>`); + fucktoy.attrXX += 15; + fucktoy.attrXY -= 10; + } + t.push(`${fucktoy.slaveName} is <span class="trust dec">apprehensive</span> of conditioning but <span class="devotion inc">thankful</span> that you're willing to help ${him} this way.`); + fucktoy.trust -= 1; + fucktoy.devotion += 1; + return t; + } + + function threesome() { + const frag = document.createDocumentFragment(); + const enjoysIncest = s => s.sexualQuirk === "perverted" || s.sexualQuirk === "sinful"; + + t = []; + t.push(`You're not done with ${fucktoy.slaveName} yet, but what good is maintaining a stable of sex slaves, if you don't have a threesome every now and then? You have your assistant call ${relative.slaveName} back to your office. ${He2} arrives in just a couple of seconds, finding ${fucktoy.slaveName} blushing with embarrassment. You inform ${him2} that you'll be using ${him2} with ${fucktoy.slaveName}.`); + if (enjoysIncest(relative) || relative.relationshipTarget === fucktoy.ID) { + t.push(`${He2} grins, clearly aroused at the thought, and comes around the desk towards the two of you.`); + } else if (relative.devotion > 50) { + t.push(`${His2} eyes widen slightly, but ${he2} is devoted enough to commit fully to whatever you ask of ${him2}.`); + } else { + t.push(`${He2} stops in ${his2} tracks, clearly disturbed by what's about to happen, until you repeat your order.`); + } + App.Events.addParagraph(frag, t); + + /* Double pen the fucktoy if she prefers dudes and can take it */ + const doublePenFucktoy = RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XY" && (canDoAnal(fucktoy) || canDoVaginal(fucktoy)) && canPenetrate(relative); + /* Double pen the relative if the fucktoy prefers chicks and the relative can take it */ + const doublePenRelative = RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XX" && (canDoAnal(relative) || canDoVaginal(relative)) && canPenetrate(fucktoy); + /* If double pen is not possible or desirable, and EITHER slave can ride you, double cowgirl on the player, so the slaves face each other */ + const doubleCowgirl = canDoAnal(fucktoy) || canDoVaginal(fucktoy) || canDoAnal(relative) || canDoVaginal(relative); + if (doublePenFucktoy || doublePenRelative) { + const recipient = doublePenFucktoy ? fucktoy : relative; + const copenetrator = doublePenFucktoy ? relative : fucktoy; + const {heR, himR, hisR} = getPronouns(recipient).appendSuffix('R'); + t = []; + t.push(`You lay back on your couch while ${recipient.slaveName} mounts you, with ${copenetrator.slaveName} getting ready behind ${himR}.`); + if (canDoAnal(recipient) && canDoVaginal(recipient)) { + t.push(`While ${heR} slides your ${V.PC.dick > 0 ? "dick" : "strapon"} into ${hisR} waiting pussy, ${copenetrator.slaveName} pushes into ${hisR} ass. You continue like this for a bit, before swapping positions with ${copenetrator.slaveName}.`); + t.push(VCheck.Both(recipient, 2, 2)); + } else { + const anal = canDoAnal(recipient); + t.push(`It's a bit tight in ${recipient.slaveName}'s ${anal ? 'ass' : 'pussy'}, with both ${copenetrator.slaveName} and your ${V.PC.dick > 0 ? "dick" : "strapon"} sharing the space, but you make it work.`); + if (anal && recipient.anus < 3) { + t.push(VCheck.Anal(recipient, 2)); + t.push(`Having both of you in ${hisR} tight ass <span class="lime">stretches it out</span> a bit.`); + recipient.anus++; + } else if (!anal && recipient.vagina < 3) { + t.push(VCheck.Vaginal(recipient, 2)); + t.push(`Having both of you in ${hisR} tight pussy <span class="lime">stretches it out</span> a bit.`); + recipient.vagina++; + } + } + t.push(`It takes a few moments to find a rythm, but ${fucktoy.slaveName} is excited that ${he} gets to do this with ${his} ${getWrittenTitle(fucktoy)} and ${his} ${relativeTerm(fucktoy, relative)}. It's easy to enjoy the change of pace, especially with ${recipient.slaveName} writhing on your ${V.PC.dick > 0 ? `dick` : `strapon`}.`); + App.Events.addParagraph(frag, t); + } else if (doubleCowgirl) { + const onDick = canDoVaginal(fucktoy) ? fucktoy : canDoVaginal(relative) ? relative : canDoAnal(fucktoy) ? fucktoy : relative; // whee + const onMouth = onDick === fucktoy ? relative : fucktoy; + const {heD} = getPronouns(onDick).appendSuffix('D'); + const {himM, heM, hisM} = getPronouns(onMouth).appendSuffix('M'); + t = []; + t.push(`You lay back on your couch ${V.PC.dick < 1 ? `with your strapon attached ` : ``}and have ${onDick.slaveName} climb onto you, facing you while ${heD} rides.`); + t.push(VCheck.Simple(onDick, 1)); + t.push(`Meanwhile, you signal to ${onMouth.slaveName} that you want to taste ${himM}, and ${heM} straddles your face, facing ${hisM} ${relativeTerm(onMouth, onDick)}.`); + t.push(`Naturally, ${fucktoy.slaveName} starts a makeout session while ${he} and ${relative.slaveName} ride you. It doesn't take long for moans to turn to screams.`); + App.Events.addParagraph(frag, t); + } else { + /* FFS, really? You have two sex slaves here, one of whom is your *personal fucktoy*, and neither can do anything but oral? Fine, have an oral triangle. */ + t = []; + t.push(`The three of you lie down together, as you order ${fucktoy.slaveName} to continue servicing you orally. You tell ${relative.slaveName} to`); + if (fucktoy.dick > 0) { + t.push(`give ${fucktoy.slaveName} a blowjob`); + } else if (fucktoy.vagina > 0) { + t.push(`eat ${fucktoy.slaveName} out`); + } else { + t.push(`give ${fucktoy.slaveName} a rimjob`); // I guess? + } + t.push(`while you get a taste of ${him2}. It takes a few moments to find a rythm, but ${fucktoy.slaveName} is excited that ${he} gets to do this with ${his} ${getWrittenTitle(fucktoy)} and ${his} ${relativeTerm(fucktoy, relative)}, and it's not long before all of you have reached orgasm.`); + seX(fucktoy, "oral", relative, "oral", 1); + App.Events.addParagraph(frag, t); + } + + t = []; + t.push(`The three of you collapse into a warm, satisfied pile of bodies. ${fucktoy.slaveName} is <span class="devotion inc">grateful</span> that you indulged ${his} fantasy, and <span class="trust inc">trusts</span> that you'll continue to keep ${his} satisfaction in mind.`); + fucktoy.devotion += 2; + fucktoy.trust += 2; + + /* did one or both of them *really* have fun? */ + if (enjoysIncest(fucktoy) && enjoysIncest(relative)) { + t.push(`On top of it all, it turns out that ${fucktoy.slaveName} and ${relative.slaveName} both really enjoy breaking the taboo of incest, and they've <span class="devotion inc">grown closer to you</span> from this encounter.`); + fucktoy.devotion += 4; + relative.devotion += 4; + } else if (enjoysIncest(fucktoy)) { + t.push(`On top of it all, it turns out that ${he} really enjoys breaking the taboo of incest, and ${he}'s <span class="devotion inc">grown closer to you</span> from this encounter.`); + fucktoy.devotion += 3; + } else if (enjoysIncest(relative)) { + t.push(`On top of it all, it turns out that ${relative.slaveName} really enjoys breaking the taboo of incest, and ${he2}'s <span class="devotion inc">grown closer to you</span> from this encounter.`); + relative.devotion += 3; + } + App.Events.addParagraph(frag, t); + + return [frag]; + } + } +}; diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js index f1317ff7fbd749f602edf5ca4ddecb6396f35336..2762760c2dd46d7c119645cdded41c73b26d82a3 100644 --- a/src/events/randomEvent.js +++ b/src/events/randomEvent.js @@ -49,6 +49,7 @@ App.Events.getIndividualEvents = function() { new App.Events.RETSSiblingTussle(), new App.Events.RETSSimpleAssault(), + new App.Events.RETSFucktoyPrefersRelative(), ]; }; diff --git a/src/facilities/farmyard/farmyard.js b/src/facilities/farmyard/farmyard.js index 13d284aa0c360ffd5addf42cfc1d7b9e461e300f..51c3e7de30c4b68302ba905b342c649da583324b 100644 --- a/src/facilities/farmyard/farmyard.js +++ b/src/facilities/farmyard/farmyard.js @@ -146,7 +146,9 @@ App.Facilities.Farmyard.farmyard = function() { V.farmyardStables = 0; V.farmyardCages = 0; - V.pit.animal = null; + if (V.pit) { + V.pit.animal = null; + } V.farmyardUpgrades = { pump: 0, diff --git a/src/facilities/pit/pit.js b/src/facilities/pit/pit.js index 5cf64c536cb0cac99d29c29cd4c437566afaf2a2..3b3b20e784bf0b1aaef5f2cc5d8d66b181a5d3d7 100644 --- a/src/facilities/pit/pit.js +++ b/src/facilities/pit/pit.js @@ -46,7 +46,6 @@ App.Facilities.Pit.pit = function() { link.append(App.UI.DOM.passageLink(`Decommission ${V.pit.name}`, "Main", () => { V.pit = null; - V.pit.fighterIDs = []; App.Arcology.cellUpgrade(V.building, App.Arcology.Cell.Market, "Pit", "Markets"); })); diff --git a/src/gui/css/mainStyleSheet.css b/src/gui/css/mainStyleSheet.css index ef081dc3f8d3afa249f9f4b931ca3df74a8597e3..211a08b16a7bce2b0848c03d0e56c8ba7894f27a 100644 --- a/src/gui/css/mainStyleSheet.css +++ b/src/gui/css/mainStyleSheet.css @@ -179,7 +179,7 @@ img.paperdoll { .chocolate, .chocolate a { color: chocolate } .saddlebrown, .saddlebrown a { color: saddlebrown } .teal, .teal a { color: teal } -.yellow, .yellow a, .noteworthy, .noteworthy a, .paraphilia.gain, .paraphilia.gain a, .devotion.ambivalent, .devotion.ambivalent a, .trust.fearful, .trust.fearful a { color: yellow } +.yellow, .yellow a, .noteworthy, .noteworthy a, .paraphilia.gain, .paraphilia.gain a, .devotion.ambivalent, .devotion.ambivalent a, .trust.fearful, .trust.fearful a, .job.change { color: yellow } .yellowgreen, .yellowgreen a, .cash.inc, .cash.inc a, .cash, .cash a { color: yellowgreen } .white a { color: white } diff --git a/src/interaction/siRules.js b/src/interaction/siRules.js index 36e60ce7c78167a305fae5064d9f92661ac6933a..8f11eafa8bc344259ae0d4acdd2f54afdaa21fbb 100644 --- a/src/interaction/siRules.js +++ b/src/interaction/siRules.js @@ -21,9 +21,9 @@ App.UI.SlaveInteract.rules = function(slave) { function updateBreederLink(breeder, exclude) { p = document.createElement('p'); - const exempt = slave[exclude] ? "Exempt" : "Include"; + const exempt = slave[exclude] ? "Include" : "Exempt"; - p.append(`Will be bred by ${breeder} when fertile. `); + p.append(`Will ${slave[exclude] ? "not " : ""}be bred by ${breeder} when fertile. `); p.append( App.UI.DOM.link(`${exempt} ${him}`, () => { slave[exclude] = slave[exclude] ^ 1; // switch 0 and 1 diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index f0d83440ac5c590323d4e24a640ae73f2efeeba3..2dde6978006d862b17d7bd4a7295547e699e1052 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -149,7 +149,7 @@ globalThis.DefaultRules = (function() { if (job.checkRequirements(slave).length !== 0) { // no message to prevent spam removeAssignment(); - } else if (!job.facility.hasFreeSpace) { + } else if (!job.facility.hasFreeSpace && slave.assignment !== rule.setAssignment) { r += getAssignmentDescription({ rule, slave, assignmentResult: "unable", append: " because it was full" @@ -1166,15 +1166,21 @@ globalThis.DefaultRules = (function() { */ function ProcessDrugs(slave, rule) { // First we check AssetGrowthDrugs, then if 1. no growth targets or 2. targets have been hit, we check other drugs. + if (slave.indentureRestrictions === 2) { + return; + } if ((slave.drugs === "super fertility drugs" || slave.drugs === "fertility drugs") && isFertile(slave)) { r += `<br>${slave.slaveName} is on ${slave.drugs} and will not be considered for drug enhancement until that regime is complete.`; ProcessOtherDrugs(slave, rule); - } else if (slave.indentureRestrictions > 1 || (rule.growth.boobs === null && rule.growth.butt === null && rule.growth.lips === null && rule.growth.dick === null && rule.growth.balls === null)) { + return; + } else if (rule.growth.boobs === null && rule.growth.butt === null && rule.growth.lips === null && rule.growth.dick === null && rule.growth.balls === null) { ProcessOtherDrugs(slave, rule); + return; } - /** @typedef {"lips" | "boobs" | "butt" | "dick" | "balls"} DrugTarget */ + + /** @typedef {"lips" | "boobs" | "butt" | "dick" | "balls"} DrugTarget */ // Asset Growth const growthDrugs = new Set(["breast injections", "breast redistributors", "butt injections", "butt redistributors", "hyper breast injections", "hyper butt injections", "hyper penis enhancement", "hyper testicle enhancement", "intensive breast injections", "intensive butt injections", "intensive penis enhancement", "intensive testicle enhancement", "lip atrophiers", "lip injections", "penis atrophiers", "penis enhancement", "testicle atrophiers", "testicle enhancement"]); @@ -1313,7 +1319,7 @@ globalThis.DefaultRules = (function() { r += `that is the only part of ${his} body that does not meet the targeted size.`; } } - } else if (growthDrugs.has(slave.drugs)) { + } else if (growthDrugs.has(slave.drugs) && slave.drugs !== rule.drug) { r += `<br>${slave.slaveName}'s body has met all relevant growth targets, so ${his} pharmaceutical regime has been ended.`; ProcessOtherDrugs(slave,rule); } @@ -1325,7 +1331,7 @@ globalThis.DefaultRules = (function() { */ function ProcessOtherDrugs(slave, rule) { // Other Drugs - if (slave.indentureRestrictions < 2 && rule.drug !== null && slave.drugs !== rule.drug) { + if (rule.drug !== undefined && rule.drug !== null && slave.drugs !== rule.drug) { let flag = true; switch (rule.drug) { case "anti-aging cream": diff --git a/src/npc/generate/newSlaveIntro.js b/src/npc/generate/newSlaveIntro.js index b30e47e753eae6a327a09ff866b5ca509949f187..2ab584e145ef490b18d00262d9e2cd330ad66fd1 100644 --- a/src/npc/generate/newSlaveIntro.js +++ b/src/npc/generate/newSlaveIntro.js @@ -4665,7 +4665,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest = }); - if (App.Entity.facilities.arcade.hasFreeSpace || V.arcadeUpgradeFuckdolls === 2) { + if (App.Entity.facilities.arcade.hasFreeSpace || V.arcadeUpgradeFuckdolls > 1) { choice({ linkName: `Send ${him} straight to the Arcade`, result(slave) { @@ -4678,7 +4678,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest = r.push(S.HeadGirl.slaveName); } r.push(`to get ${slave.slaveName} set up in ${V.arcadeName}. The new slave does not know what ${V.arcadeName} is, not really, and ${he} doesn't know what being set up there means, either. ${He}'ll be confined inside a small space, not too different from the indignities ${he}'s suffered already. It's only when the restraints lock into place that ${he}'ll understand ${his} doom. ${His} mouth will be forced open and presented at one wall of ${V.arcadeName}, and ${his} ass will protrude from its other side, ${his} holes available for public relief at both ends. ${He}'ll probably refuse to believe the truth, until the first cockhead enters ${his} mouth${(slave.vagina > -1) ? `, parts ${his} pussylips,` : ``} or presses against ${his} poor anus.`); - if (V.arcade <= App.Entity.facilities.arcade.employeesIDs().size) { + if (!App.Entity.facilities.arcade.hasFreeSpace) { r.push(`Mere`); if (V.showInches === 2) { r.push(`yards`); diff --git a/src/uncategorized/arcade.tw b/src/uncategorized/arcade.tw index c4c9d54d5735556b876039b8b9878cf3144dd97f..db8d593a71dc340e0b385a23e7999cf4a47ab44d 100644 --- a/src/uncategorized/arcade.tw +++ b/src/uncategorized/arcade.tw @@ -159,12 +159,17 @@ <<if $arcadeUpgradeFuckdolls == 1>> equipped to convert inmates into standard Fuckdolls. The converter can be put to work on your order. <div class="choices"> - [[Turn on conversion|Arcade][$arcadeUpgradeFuckdolls = 2]] + [[Turn on conversion|Arcade][$arcadeUpgradeFuckdolls = 2]] | [[Turn on bulk conversion|Arcade][$arcadeUpgradeFuckdolls = 3]] </div> <<elseif $arcadeUpgradeFuckdolls == 2>> equipped to convert inmates into standard Fuckdolls. The converter is currently active and will convert the least popular girl at the end of the week. <div class="choices"> - [[Turn off conversion|Arcade][$arcadeUpgradeFuckdolls = 1]] + [[Turn off conversion|Arcade][$arcadeUpgradeFuckdolls = 1]] | [[Switch to bulk conversion|Arcade][$arcadeUpgradeFuckdolls = 3]] + </div> + <<elseif $arcadeUpgradeFuckdolls == 3>> + equipped to convert inmates into standard Fuckdolls. The converter is currently active and will convert underperforming girls at the end of the week. + <div class="choices"> + [[Turn off conversion|Arcade][$arcadeUpgradeFuckdolls = 1]] | [[Switch to single conversion|Arcade][$arcadeUpgradeFuckdolls = 2]] </div> <<else>> <<set _Tmult2 = Math.trunc(5000*$upgradeMultiplierArcology)>> diff --git a/src/uncategorized/arcadeReport.tw b/src/uncategorized/arcadeReport.tw deleted file mode 100644 index 2f2dca07c7e394d40b8a15dba49052161ee1578f..0000000000000000000000000000000000000000 --- a/src/uncategorized/arcadeReport.tw +++ /dev/null @@ -1,298 +0,0 @@ -:: Arcade Report [nobr] - -<span id="arcade-stats"> -</span> - -<<set _slaves = App.Utils.sortedEmployees(App.Entity.facilities.arcade)>> -<<set _DL = _slaves.length, _SL = $slaves.length, _cockmilked = 0, _milked = 0, _milkProfits = 0, _profits = 0, _oldCash = 0, _boobsImplanted = 0, _prostatesImplanted = 0, _vasectomiesUndone = 0, _mSlave = 0, _bSlave = 0, _pSlave = 0, _cSlave = 0>> - -<!-- Statistics gathering --> -<<set $facility = $facility || {}, $facility.arcade = initFacilityStatistics($facility.arcade)>> -<<set _arcadeNameCaps = capFirstChar($arcadeName)>> - - <<if (_DL > 1)>>''There are _DL inmates confined in $arcadeName.''<<else>>''There is one inmate confined in $arcadeName.''<</if>> -<<if ($arcologies[0].FSDegradationist > 20)>> - <<if $arcologies[0].FSDegradationistLaw == 1>> - The tenants located near the arcade consider the facility a normal part of their surroundings, including the crowd of menial slaves waiting their turn spills out into the hallway, 24 hours a day. - <<else>> - The tenants located near the arcade consider the facility a normal part of their surroundings. - <</if>> -<<elseif ($arcologies[0].FSPaternalist > 20)>> - The tenants located near the arcade consider it an @@.red;intolerable@@ establishment. -<</if>> -<<if $arcadeDecoration != "standard">> - <br><br> _arcadeNameCaps's customers enjoy @@.green;getting off in $arcadeDecoration surroundings.@@ -<</if>> - -<<for _slave range _slaves>> - <<setLocalPronouns _slave>> - <<set $i = $slaveIndices[_slave.ID]>> /% for the included passages %/ - - /* Perform facility based rule changes */ - <<set _slave.clothes = "no clothing">> - /* Health */ - <<if $arcadeUpgradeHealth == 2 && _slave.health.condition < 40>> - <<run improveCondition(_slave, 2)>> - <<elseif _slave.health.condition > 20>> - <<run healthDamage(_slave, 5)>> - <<elseif $arcadeUpgradeHealth == 1 && _slave.health.condition < -30>> - <<run improveCondition(_slave, 2)>> - <<elseif _slave.health.condition > -50>> - <<run healthDamage(_slave, 3)>> - <<elseif _slave.health.condition > -90>> - <<run healthDamage(_slave, 1)>> - <</if>> - /* Curatives */ - <<if $arcadeUpgradeHealth == 2>> - <<set _slave.curatives = 2>> - <<elseif $arcadeUpgradeHealth == 1>> - <<set _slave.curatives = 1>> - <</if>> - /* Stimulation or lack thereof trust/devotion effect */ - <<if ($arcadeUpgradeInjectors > 0)>> - <<if $arcadeUpgradeInjectors == 2>> - <<set _slave.aphrodisiacs = 2>> - <</if>> - <<set _slave.devotion -= 5, _slave.trust -= 10>> - <<else>> - <<set _slave.trust -= 5>> - <</if>> - /* Muscles */ - <<if (_slave.muscles > -100)>> - <<set _slave.muscles-->> - <</if>> - - <<if $showEWD != 0>> - <br><br> - /* 000-250-006 */ - <<if $seeImages && $seeReportImages>> - <div class="imageRef tinyImg"> - <<= SlaveArt(_slave, 0, 0)>> - </div> - <</if>> - /* 000-250-006 */ - <<includeDOM App.EndWeek.favoriteIcon(_slave)>> - <span class='slave-name'><<= SlaveFullName(_slave)>></span> - <<if _slave.choosesOwnAssignment == 2>> - <<= App.SlaveAssignment.choosesOwnJob(_slave)>> - <<else>> - is confined in $arcadeName. - <</if>> - <br> $He <<= App.SlaveAssignment.workAGloryHole(_slave)>> - <<else>> - <<run App.SlaveAssignment.choosesOwnJob(_slave)>> - <<run App.SlaveAssignment.workAGloryHole(_slave)>> - <</if>> - <<if ($arcadeUpgradeCollectors > 0)>> - <<if (_slave.vasectomy == 1)>> - <<set _slave.vasectomy = 0, _vasectomiesUndone++>> - <<run cashX(forceNeg($surgeryCost), "slaveSurgery", _slave), surgeryDamage(_slave, 10)>> - <<elseif (_slave.lactation < 2)>> - <<set _slave.lactation = 2, _boobsImplanted++>> - <<set _bSlave = _slave>> - <<run cashX(forceNeg($surgeryCost), "slaveSurgery", _slave), surgeryDamage(_slave, 10)>> - <<elseif _slave.prostate == 1>> - <<set _slave.prostate = 2, _prostatesImplanted++>> - <<set _pSlave = _slave>> - <<run cashX(forceNeg($surgeryCost), "slaveSurgery", _slave), surgeryDamage(_slave, 10)>> - <<elseif (_slave.lactation > 0) || (_slave.balls > 0)>> - <<set _milkResults = App.SlaveAssignment.getMilked(_slave, 1.0)>> - <<if $showEWD != 0>> - <br> $He <<= _milkResults.text>> - <</if>> - <<set _milkProfits += _milkResults.cash>> - <<set _growth = 0>> - <<set _gigantomastiaMod = _slave.geneticQuirks.gigantomastia == 2 ? (_slave.geneticQuirks.macromastia == 2 ? 3 : 2) : 1>> - <<if (_slave.boobs < 2000)>> - <<set _growth = 100>> - <<elseif (_slave.boobs < 5000*_gigantomastiaMod)>> - <<set _growth = 50>> - <<elseif (_slave.boobs < 10000*_gigantomastiaMod)>> - <<set _growth = 25>> - <</if>> - <<if (_slave.geneMods.NCS == 1)>> - /* - ** NCS will allow some growth for Arcade milking, but not as much as the Dairy. - */ - <<set _growth = Math.trunc(_growth/3.5)>> - <</if>> - <<set _slave.boobs += _growth>> - <<if ((_slave.balls > 0) && (_slave.balls < 10) && (random(1,100) > (40 + (10 * (_slave.balls + (2 * _slave.geneMods.NCS))))))>> - <<set _slave.balls++>> - <</if>> - <<if ((_slave.dick > 0) && (_slave.dick < 10) && (random(1,100) > (40 + (10 * _slave.dick + (2 * _slave.geneMods.NCS)))))>> - <<set _slave.dick++>> - <</if>> - <<if (_slave.lactation > 0)>> - <<set _milked++>> - <<set _mSlave = _slave>> - <</if>> - <<if (_slave.balls > 0)>> - <<set _cockmilked++>> - <<set _cSlave = _slave>> - <</if>> - <</if>> - <</if>> - <<if (_slave.inflation > 0)>> - <<run deflate(_slave)>> - <</if>> - <<if $showEWD != 0>> - <br> - <<includeDOM App.SlaveAssignment.rules(_slave)>> - <<= App.SlaveAssignment.diet(_slave)>> - <<includeDOM App.SlaveAssignment.longTermEffects(_slave)>> - <<= App.SlaveAssignment.drugs(_slave)>> - <<= App.SlaveAssignment.relationships(_slave)>> - <<= App.SlaveAssignment.rivalries(_slave)>> - <br> <<= App.SlaveAssignment.devotion(_slave)>> - <<else>> - <<run App.SlaveAssignment.rules()>> - <<run App.SlaveAssignment.diet(_slave)>> - <<run App.SlaveAssignment.longTermEffects(_slave)>> - <<run App.SlaveAssignment.drugs(_slave)>> - <<run App.SlaveAssignment.relationships(_slave)>> - <<run App.SlaveAssignment.rivalries(_slave)>> - <<run App.SlaveAssignment.devotion(_slave)>> - <</if>> -<</for>> - -<<if _DL + $fuckdolls > 0>> - <br><br> - <<if _milked == 1>> - <<setLocalPronouns _mSlave>> - One of them is lactating and spends $his time in $arcadeName being simultaneously milked and fucked. - <<elseif _milked > 1>> - _milked of them are lactating and spend their time in $arcadeName being simultaneously milked and fucked. - <</if>> - - <<if _vasectomiesUndone>> - <<if _vasectomiesUndone == 1>> - One - <<else>> - _vasectomiesUndone - <</if>> - of them had severed vas deferens, so they were reattached to allow sperm through, costing @@.red;<<print cashFormat($surgeryCost*_vasectomiesUndone)>>.@@ - <</if>> - <<if _boobsImplanted>> - <<if _boobsImplanted == 1>> - <<setLocalPronouns _bSlave>> - One of them was not lactating, so $he was - <<else>> - _boobsImplanted of them were not lactating, so they were - <</if>> - implanted with long-acting lactation inducing drugs, costing @@.red;<<print cashFormat($surgeryCost*_boobsImplanted)>>.@@ - <</if>> - <<if _prostatesImplanted>> - <<if _prostatesImplanted == 1>> - <<setLocalPronouns _pSlave>> - One of them was not producing the maximum possible amount of precum, so $he was - <<else>> - _prostatesImplanted of them were not producing the maximum possible amount of precum, so they were - <</if>> - implanted with long-acting prostate stimulation drugs, costing @@.red;<<print cashFormat($surgeryCost*_prostatesImplanted)>>.@@ - <</if>> - <<if _cockmilked == 1>> - <<setLocalPronouns _cSlave>> - One of them retains testicles and is brutally cockmilked as $he is used. - <<elseif _cockmilked > 1>> - _cockmilked of them retain testicles and are brutally cockmilked as they are used. - <</if>> - - The arcade makes you - <<if $policies.publicFuckdolls == 0>> - @@.yellowgreen;<<print cashFormat(_profits)>>@@ from selling the inmates' holes - <<else>> - @@.green;more reputable@@ from freely providing the inmates' holes - <</if>> - <<if $arcadeUpgradeCollectors > 0 && $policies.publicFuckdolls == 0>> - and - <</if>> - <<if $arcadeUpgradeCollectors > 0>> - @@.yellowgreen;<<print cashFormat(_milkProfits)>>@@ from selling the fluids they produced - <</if>> - this week. - <<if ($arcologies[0].FSPaternalist > 20)>> - <<run repX(forceNeg(Math.trunc(_profits/20)), "arcade")>> - <</if>> -<</if>> - -<<if ($arcadeUpgradeFuckdolls == 2)>> - <<set _currentSlave = 0, _Age = -1, _FD = -1, _MB = -1, _Con = -1>> - <<for _slave range _slaves>> - <<if _slave.sentence == 0>> /* let's not convert slaves we are punishing into Fuckdolls */ - <<if (_slave.fetish == "mindbroken")>> - <<if (_slave.fuckdoll == 0)>> - <<if (_slave.physicalAge > 35)>> - <<set _Age = $i>> - <<break>> - <<elseif _FD == -1>> - <<set _FD = $i>> - <</if>> - <<elseif _MB == -1>> - <<if _slave.vagina >= 4 || _slave.anus >= 4>> - <<set _Con = $i>> - <<elseif _slave.physicalAge > 35>> - <<set _Age = $i>> - <<else>> - <<set _MB = $i>> - <</if>> - <</if>> - <<elseif _Con == -1>> - <<if _slave.vagina >= 4 || _slave.anus >= 4>> - <<set _Con = $i>> - <<elseif _slave.physicalAge > 35>> - <<set _Age = $i>> - <</if>> - <</if>> - <</if>> - <</for>> - <<if _FD > -1>> - <<set _currentSlave = $slaves[_FD]>> - <<elseif _Con > -1>> - <<set _currentSlave = $slaves[_Con]>> - <<elseif _MB > -1>> - <<set _currentSlave = $slaves[_MB]>> - <<elseif _Age > -1>> - <<set _currentSlave = $slaves[_Age]>> - <</if>> - <<if _currentSlave != 0>> - <<run App.Utils.setLocalPronouns(_currentSlave)>> - <br> _currentSlave.slaveName is low-quality merchandise, so $he has been converted into a Fuckdoll. - <<= removeSlave(_currentSlave)>> - <<if _currentSlave == 0>> /% if not zero then technically there was an error INVALID SLAVE %/ - <<set $fuckdolls++, _SL-->> - <</if>> - <<else>> - <br> No slaves have failed quality inspection for Fuckdoll conversion. _arcadeNameCaps will remain overcrowded this week. - <</if>> -<</if>> - -<<if _DL > 0>> - <!-- Record statistics gathering --> - <<script>> - var b = State.variables.facility.arcade; - b.whoreIncome = 0; - b.customers = 0; - b.whoreCosts = 0; - b.rep = 0; - for (var si of b.income.values()) { - b.whoreIncome += si.income; - b.customers += si.customers; - b.whoreCosts += si.cost; - b.rep += si.rep; - } - b.maintenance = State.variables.arcade * State.variables.facilityCost * (0.05 + 0.02 * State.variables.arcadeUpgradeInjectors + 0.05 * State.variables.arcadeUpgradeCollectors); - b.totalIncome = b.whoreIncome; - b.totalExpenses = b.whoreCosts + b.maintenance; - b.profit = b.totalIncome - b.totalExpenses; - <</script>> - - <!-- Statistics output --> - <<includeDOM App.Facilities.Arcade.Stats(false)>> - <<timed 50ms>> - <<replace #arcade-stats>> - <<includeDOM App.Facilities.Arcade.Stats(true)>> - <</replace>> - <</timed>> - <br><br> -<</if>> diff --git a/src/uncategorized/cellblockReport.tw b/src/uncategorized/cellblockReport.tw deleted file mode 100644 index 8a2d3b4426fdf6360f035987da697c5d79beae08..0000000000000000000000000000000000000000 --- a/src/uncategorized/cellblockReport.tw +++ /dev/null @@ -1,308 +0,0 @@ -:: Cellblock Report [nobr] - -<<set _slaves = App.Utils.sortedEmployees(App.Entity.facilities.cellblock)>> -<<set _DL = _slaves.length, _SL = $slaves.length, _brokenSlaves = 0, _idleBonus = 0, _softenedQuirks = 0, _trustMalus = 0, _FLsFetish = 0>> - -<<if $cellblockDecoration != "standard">> - <<set _devBonus = 1>> -<<else>> - <<set _devBonus = 0>> -<</if>> -<<set _cellblockNameCaps = capFirstChar($cellblockName)>> -<<set $flSex = App.EndWeek.getFLSex(App.Entity.facilities.cellblock)>> /* FIXME: should be local, passed as a parameter to saRules */ - -<<if (_S.Wardeness)>> - <<setLocalPronouns _S.Wardeness>> - - <<if (_S.Wardeness.health.condition < -80)>> - <<run improveCondition(_S.Wardeness, 20)>> - <<elseif (_S.Wardeness.health.condition < -40)>> - <<run improveCondition(_S.Wardeness, 15)>> - <<elseif (_S.Wardeness.health.condition < 0)>> - <<run improveCondition(_S.Wardeness, 10)>> - <<elseif (_S.Wardeness.health.condition < 90)>> - <<run improveCondition(_S.Wardeness, 7)>> - <</if>> - <<if (_S.Wardeness.devotion <= 60)>> - <<set _S.Wardeness.devotion += 2>> - <</if>> - <<set _S.Wardeness.devotion += _devBonus>> - <<if _S.Wardeness.trust < 60>> - <<set _S.Wardeness.trust += 3>> - <</if>> - <<if (_S.Wardeness.rules.living != "luxurious")>> - <<set _S.Wardeness.rules.living = "luxurious">> - <</if>> - <<if _S.Wardeness.rules.rest != "restrictive">> - <<set _S.Wardeness.rules.rest = "restrictive">> - <</if>> - <<if _S.Wardeness.fetishStrength <= 95>> - <<if _S.Wardeness.fetish != "sadist">> - <<if fetishChangeChance(_S.Wardeness) > random(0,100)>> - <<set _FLsFetish = 1, _S.Wardeness.fetishKnown = 1, _S.Wardeness.fetish = "sadist">> - <</if>> - <<elseif _S.Wardeness.fetishKnown == 0>> - <<set _FLsFetish = 1, _S.Wardeness.fetishKnown = 1>> - <<else>> - <<set _FLsFetish = 2, _S.Wardeness.fetishStrength += 4>> - <</if>> - <</if>> - <<if (_S.Wardeness.energy > 95) || (_S.Wardeness.fetish == "sadist")>> - <<set _devBonus++, _trustMalus++, _idleBonus++>> - <</if>> - <<= SlaveFullName(_S.Wardeness)>> is serving as the Wardeness. - <<if _S.Wardeness.relationship == -3 && _S.Wardeness.devotion > 50>> - <<set _devBonus++, _trustMalus++, _idleBonus++>> - As your $wife, $he tries $his best to break the disobedient slaves to your will. - <</if>> - <<if (_FLsFetish == 1)>> - One day $he demands obedience. The next day $he strikes a slave when it isn't given. The next, $he seems more excited than embarrassed when beating a prisoner. Soon, $he's looking for an excuse to punish. $He's @@.pink;become more of a sadist.@@ - <<elseif (_FLsFetish == 2)>> - Being not only allowed but encouraged to get off while punishing prisoners @@.lightsalmon;deepens $his sadism.@@ - <</if>> - <<if setup.wardenessCareers.includes(_S.Wardeness.career)>> - <<set _devBonus++, _trustMalus++, _idleBonus++>> - $He has experience with detecting security issues and grinding down potential miscreants from $his life before $he was a slave, making $him more effective. - <<elseif _S.Wardeness.skill.wardeness >= $masteredXP>> - <<set _devBonus++, _trustMalus++, _idleBonus++>> - $He has experience with detecting security issues and grinding down potential miscreants from working for you, making $him more effective. - <<else>> - <<set _S.Wardeness.skill.wardeness += random(1,Math.ceil((_S.Wardeness.intelligence+_S.Wardeness.intelligenceImplant)/15) + 8)>> - <</if>> - <<if _S.Wardeness.fetish == "sadist">> - $He uses the prisoners to gratify $his sadism, terrifying them and quickly breaking their resistance. - <<elseif _S.Wardeness.energy > 95>> - $He is so sexually depraved that $he constantly molests the prisoners, breaking them to a life of servitude. - <</if>> - <<if _S.Wardeness.sexualFlaw == "malicious" || _S.Wardeness.sexualFlaw == "abusive">> - <<set _devBonus++, _trustMalus += 2, _idleBonus += 2>> - Sexual abuse of prisoners has become an end for $him, not a means. $He inspires $his prisoners to do everything possible to qualify to get away from $him, even as $he slowly grinds away their interest in sex to do it. - <<elseif _S.Wardeness.sexualQuirk == "caring">> - <<set _devBonus--, _trustMalus--, _idleBonus-->> - $His kindness sometimes shows through $his tough facade, letting prisoners get off easier than they should. - <</if>> - <<if (_S.Wardeness.dick > 2) && (canPenetrate(_S.Wardeness))>> - <<set _devBonus++, _trustMalus++, _idleBonus++>> - $His molestation of the prisoners is more varied and effective because $he has a dick to fuck them with. - <</if>> - <<if (_S.Wardeness.muscles > 35)>> - <<set _devBonus++, _trustMalus++, _idleBonus++>> - $He is strong enough to restrain anyone that tries anything with $his own hands. - <</if>> - <<if (_S.Wardeness.devotion > 95)>> - <<set _devBonus++, _trustMalus++, _idleBonus++>> - $His devotion to you is so absolute that $he sees breaking bitches for your service as a noble calling. - <</if>> - <<for _slave range _slaves>> - <<if _S.Wardeness.rivalryTarget == _slave.ID>> - $He greatly enjoys breaking $his <<print rivalryTerm(_S.Wardeness)>>, _slave.slaveName's will. - <<set _slave.devotion++, _slave.trust -= 3>> - <<if random(1,100) > 30>> - <<set _S.Wardeness.rivalry++, _slave.rivalry++>> - <</if>> - <<elseif _S.Wardeness.relationshipTarget == _slave.ID>> - $He hates having to break $his <<print relationshipTerm(_S.Wardeness)>>, _slave.slaveName, but $his devotion to you wins out in the end. - <<set _slave.devotion++, _slave.trust -= 3>> - <<if random(1,100) >= 50>> - $His and _slave.slaveName's relationship has been shattered by these events. - <<set _S.Wardeness.relationship = 0, _S.Wardeness.relationshipTarget = 0 _slave.relationship = 0, _slave.relationshipTarget = 0>> - <</if>> - <<elseif areRelated(_S.Wardeness, _slave)>> - <<setLocalPronouns _slave 2>> - $He shows $his <<print relativeTerm(_S.Wardeness,_slave)>> _slave.slaveName no mercy, making sure _he2 understands _his2 place. - <<set _slave.devotion++, _slave.trust-->> - <</if>> - <</for>> - <<if (_DL < $cellblock && !slaveResting(_S.Wardeness))>> - <<set _seed = random(1,10)+(($cellblock-_DL)*(random(150,170)+(_idleBonus*10)))>> - <<run cashX(_seed, "cellblock", _S.Wardeness)>> - <br> Since $he doesn't have enough prisoners to manage to keep $him busy, $he works on citizens' slaves, earning @@.yellowgreen;<<print cashFormat(_seed)>>.@@ - <</if>> - <<if (_DL > 0)>><br><br><</if>> -<</if>> - -<<if (_DL > 0)>> - <<if (_DL == 1)>>''One slave is being confined in $cellblockName until they are willing to obey.''<<else>>''_DL slaves are being confined in $cellblockName until they are willing to obey.''<</if>> -<</if>> - -<<if (_S.Wardeness)>> - <<set $i = $slaveIndices[$WardenessID]>> /* apply following SA passages to facility leader */ - <<if $showEWD != 0>> - <br><br> - /* 000-250-006 */ - <<if $seeImages && $seeReportImages>> - <div class="imageRef tinyImg"> - <<= SlaveArt(_S.Wardeness, 0, 0)>> - </div> - <</if>> - /* 000-250-006 */ - <<includeDOM App.EndWeek.favoriteIcon($slaves[$i])>> - <span class='slave-name'><<= SlaveFullName($slaves[$i])>></span> is serving as the Wardeness in $cellblockName. - <br> - <<= App.SlaveAssignment.choosesOwnClothes($slaves[$i])>> - <<run tired($slaves[$i])>> - <<includeDOM App.SlaveAssignment.rules($slaves[$i])>> - <<= App.SlaveAssignment.diet($slaves[$i])>> - <<includeDOM App.SlaveAssignment.longTermEffects($slaves[$i])>> - <<= App.SlaveAssignment.drugs($slaves[$i])>> - <<= App.SlaveAssignment.relationships($slaves[$i])>> - <<= App.SlaveAssignment.rivalries($slaves[$i])>> - <br> <<= App.SlaveAssignment.devotion($slaves[$i])>> - <<else>> - <<run App.SlaveAssignment.choosesOwnClothes($slaves[$i])>> - <<run tired($slaves[$i])>> - <<run App.SlaveAssignment.rules($slaves[$i])>> - <<run App.SlaveAssignment.diet($slaves[$i])>> - <<run App.SlaveAssignment.longTermEffects($slaves[$i])>> - <<run App.SlaveAssignment.drugs($slaves[$i])>> - <<run App.SlaveAssignment.relationships($slaves[$i])>> - <<run App.SlaveAssignment.rivalries($slaves[$i])>> - <<run App.SlaveAssignment.devotion($slaves[$i])>> - <</if>> -<</if>> - -<<for _slave range _slaves>> - <<set $i = $slaveIndices[_slave.ID]>> - <<setLocalPronouns _slave>> - <<if (_slave.devotion <= 20)>> - <<if (_slave.trust >= -20)>> - <<if ((_slave.hears == -1 && _slave.earwear != "hearing aids") || (_slave.hears == 0 && _slave.earwear == "muffling ear plugs") ||(_slave.hears == -2))>> - <<set _slave.devotion -= 2, _slave.trust -= 2>> - <<else>> - <<set _slave.devotion -= 4, _slave.trust -= 4>> - <</if>> - <<else>> - <<set _slave.devotion++>> - <</if>> - <</if>> - <<switch $cellblockDecoration>> - <<case "Paternalist">> - <<set _slave.rules.living = "normal">> - <<if (_slave.inflation > 0)>> - <<run deflate(_slave)>> - <</if>> - <<case "Pastoralist">> - <<set _slave.rules.living = "spare">> - <<if _slave.inflation == 0>> - <<if _slave.pregKnown == 0 && _slave.bellyImplant < 1500>> - <<set _slave.inflation = 2, _slave.inflationType = "milk", _slave.inflationMethod = 1>> - <<else>> - <<set _slave.inflation = 1, _slave.inflationType = "milk", _slave.inflationMethod = 1>> - <</if>> - <<run SetBellySize(_slave)>> - <</if>> - <<case "Hedonistic">> - <<set _slave.rules.living = "spare">> - <<if _slave.weight < 200>> - <<if _slave.weightDirection == 1>> - <<set _slave.weight += 5>> - <<elseif _slave.weightDirection == -1>> - <<set _slave.weight += 1>> - <<else>> - <<set _slave.weight += 3>> - <</if>> - <</if>> - <<if _slave.muscles > -100>> - <<set _slave.muscles -= 2>> - <</if>> - <<if _slave.inflation == 0>> - <<if _slave.pregKnown == 0 && _slave.bellyImplant < 1500>> - <<set _slave.inflation = 3, _slave.inflationType = "food", _slave.inflationMethod = 1>> - <<else>> - <<set _slave.inflation = 1, _slave.inflationType = "food", _slave.inflationMethod = 1>> - <</if>> - <<run SetBellySize(_slave)>> - <</if>> - <<default>> - <<set _slave.rules.living = "spare">> - <<if (_slave.inflation > 0)>> - <<run deflate(_slave)>> - <</if>> - <</switch>> - <<if $cellblockUpgrade == 1>> - <<if (_slave.behavioralFlaw != "none") && (_slave.behavioralQuirk == "none")>> - <<run SoftenBehavioralFlaw(_slave)>> - <<set _slave.devotion -= 10, _softenedQuirks++>> - <<elseif (_slave.sexualFlaw != "none") && (_slave.sexualQuirk == "none")>> - <<run SoftenSexualFlaw(_slave)>> - <<set _slave.devotion -= 10, _softenedQuirks++>> - <</if>> - <</if>> - <<set _slave.devotion += _devBonus, _slave.trust -= _trustMalus>> - <<if (_S.Wardeness) && (_S.Wardeness.sexualFlaw == "malicious") && (_slave.energy >= 2)>> - <<set _slave.energy -= 2>> - <</if>> - <<if (_slave.health.condition < -80)>> - <<run improveCondition(_slave, 20)>> - <<elseif (_slave.health.condition < -40)>> - <<run improveCondition(_slave, 15)>> - <<elseif (_slave.health.condition < 0)>> - <<run improveCondition(_slave, 10)>> - <<elseif (_slave.health.condition < 40)>> - <<run improveCondition(_slave, 7)>> - <<elseif (_slave.health.condition < 100)>> - <<run improveCondition(_slave, 3)>> - <</if>> - <<if $showEWD != 0>> - <br><br> - /* 000-250-006 */ - <<if $seeImages && $seeReportImages>> - <div class="imageRef tinyImg"> - <<= SlaveArt(_slave, 0, 0)>> - </div> - <</if>> - /* 000-250-006 */ - <<includeDOM App.EndWeek.favoriteIcon(_slave)>> - <span class='slave-name'><<= SlaveFullName(_slave)>></span> - <<if _slave.choosesOwnAssignment == 2>> - <<= App.SlaveAssignment.choosesOwnJob(_slave)>> - <<else>> - is confined in $cellblockName. - <</if>> - <br> $He <<= App.SlaveAssignment.stayConfined(_slave)>> - <br> - <<includeDOM App.SlaveAssignment.rules(_slave)>> - <<= App.SlaveAssignment.diet(_slave)>> - <<includeDOM App.SlaveAssignment.longTermEffects(_slave)>> - <<= App.SlaveAssignment.drugs(_slave)>> - <<= App.SlaveAssignment.relationships(_slave)>> - <<= App.SlaveAssignment.rivalries(_slave)>> - <br> <<= App.SlaveAssignment.devotion(_slave)>> - <<else>> - <<silently>> - <<run App.SlaveAssignment.choosesOwnJob(_slave)>> - <<run App.SlaveAssignment.stayConfined(_slave)>> - <<run App.SlaveAssignment.rules(_slave)>> - <<run App.SlaveAssignment.diet(_slave)>> - <<run App.SlaveAssignment.longTermEffects(_slave)>> - <<run App.SlaveAssignment.drugs(_slave)>> - <<run App.SlaveAssignment.relationships(_slave)>> - <<run App.SlaveAssignment.rivalries(_slave)>> - <<run App.SlaveAssignment.devotion(_slave)>> - <</silently>> - <</if>> -<</for>> -<<if (_softenedQuirks) || (_brokenSlaves)>> - <br><br> - <<if (_softenedQuirks > 0)>> - _cellblockNameCaps's advanced compliance systems successfully softened - <<if (_softenedQuirks == 1)>> - one slave's mental flaw into an @@.green;appealing quirk,@@ though the constant correction caused them @@.mediumorchid;considerable anguish.@@ - <<else>> - _softenedQuirks slaves' mental flaws into @@.green;appealing quirks,@@ though the constant correction caused them @@.mediumorchid;considerable anguish.@@ - <</if>> - <</if>> - <<if (_brokenSlaves > 0)>> - <<if (_brokenSlaves == 1)>> - One slave is now willing to @@.hotpink;do as they're told@@ and has been released. - <<else>> - _brokenSlaves slaves are now willing to @@.hotpink;do as they're told@@ and have been released. - <</if>> - <<if $cellblockDecoration != "standard">> - <br><br> _cellblockNameCaps's $cellblockDecoration atmosphere @@.hotpink;had an impact on them while they were@@ imprisoned. - <</if>> - <</if>> -<</if>> -<<if _DL > 0 || _S.Wardeness>> - <br><br> -<</if>> diff --git a/src/uncategorized/fullReport.tw b/src/uncategorized/fullReport.tw deleted file mode 100644 index 95d64be55e6178b8149b4e3c8b328f271593c277..0000000000000000000000000000000000000000 --- a/src/uncategorized/fullReport.tw +++ /dev/null @@ -1,94 +0,0 @@ -:: Full Report [nobr] - -/* 000-250-006 */ -<<if $seeImages && $seeReportImages>> - <div class="imageRef medImg"> - <<= SlaveArt($slaves[$i], 2, 0)>> - </div> -<</if>> -/* 000-250-006 */ - -<<setLocalPronouns $slaves[$i]>> - -<<switch $slaves[$i].assignment>> -<<case "rest">> - <<= App.SlaveAssignment.rest($slaves[$i])>> -<<case "whore">> - <<= App.SlaveAssignment.whore($slaves[$i])>> -<<case "serve the public">> - <<= App.SlaveAssignment.serveThePublic($slaves[$i])>> -<<case "work a glory hole">> - <<= App.SlaveAssignment.workAGloryHole($slaves[$i])>> -<<case "get milked">> - <<set _milkResults = App.SlaveAssignment.getMilked($slaves[$i])>> - <<= _milkResults.text>> -<<case "take classes">> - <<= App.SlaveAssignment.takeClasses($slaves[$i])>> -<<case "please you">> - <<= App.SlaveAssignment.pleaseYou($slaves[$i])>> -<<case "be a subordinate slave">> - <<= App.SlaveAssignment.serveYourOtherSlaves($slaves[$i])>> -<<case "be a servant">> - <<= App.SlaveAssignment.servant($slaves[$i])>> -<<case "stay confined">> - <<= App.SlaveAssignment.stayConfined($slaves[$i])>> -<<case "guard you">> - <<= App.SlaveAssignment.guardYou($slaves[$i])>> -<<case "be your Head Girl">> - <<= App.SlaveAssignment.beYourHeadGirl($slaves[$i])>> -<<case "recruit girls">> - <<= App.SlaveAssignment.recruitGirls($slaves[$i])>> -<<default>> - <<= removeJob($slaves[$i], $slaves[$i].assignment)>> - <<= App.SlaveAssignment.rest($slaves[$i])>> -<</switch>> - -<<if $servantMilkers == 1 && $slaves[$i].lactation > 0 && $slaves[$i].assignment != "get milked">> - $His assignment - <<if setup.servantMilkersJobs.includes($slaves[$i].assignment)>> - is not strenuous, so $he <<if $slaves[$i].devotion > 20>><<if $slaves[$i].fetish == "boobs">>eagerly <</if>>uses<<elseif $slaves[$i].devotion >= -20>>is required to use<<else>>is forced to use<</if>> the penthouse milkers frequently, - <<set _milkResult = App.SlaveAssignment.getMilked($slaves[$i], 0.5)>> - <<else>> - keeps $him busy, but $he <<if $slaves[$i].devotion > 20>><<if $slaves[$i].fetish == "boobs">>eagerly <</if>>uses<<elseif $slaves[$i].devotion >= -20>>is required to use<<else>>is forced to use<</if>> the penthouse milkers whenever $he can, - <<set _milkResult = App.SlaveAssignment.getMilked($slaves[$i], 0.25)>> - <</if>> - and $he gives <<= _milkResult.milk>> liters of milk over the week, which is sold for @@.yellowgreen;<<print cashFormat(_milkResult.milkSale)>>.@@ -<</if>> - -<br> -<<if $slaves[$i].minorInjury != 0>> - $His $slaves[$i].minorInjury will heal by the end of the week. -<</if>> - -<<if $showEWD == 0>> - <<includeDOM App.SlaveAssignment.rules($slaves[$i])>> - <<run App.SlaveAssignment.choosesOwnClothes($slaves[$i])>> - <<run App.SlaveAssignment.diet($slaves[$i])>> - <<run App.SlaveAssignment.longTermEffects($slaves[$i])>> - <<run App.SlaveAssignment.drugs($slaves[$i])>> - <<run App.SlaveAssignment.relationships($slaves[$i])>> - <<run App.SlaveAssignment.rivalries($slaves[$i])>> -<<else>> - <<includeDOM App.SlaveAssignment.rules($slaves[$i])>> - <<= App.SlaveAssignment.choosesOwnClothes($slaves[$i])>> - <<= App.SlaveAssignment.diet($slaves[$i])>> - <<includeDOM App.SlaveAssignment.longTermEffects($slaves[$i])>> - <<= App.SlaveAssignment.drugs($slaves[$i])>> - <<= App.SlaveAssignment.relationships($slaves[$i])>> - <<= App.SlaveAssignment.rivalries($slaves[$i])>> - <br> -<</if>> - -<<if $PC.health.shortDamage < 30 && Array.isArray($personalAttention) && $personalAttention.findIndex(function(s) { return s.ID == $slaves[$i].ID; }) != -1>> - <<includeDOM personalAttention($slaves[$i])>> -<</if>> - -<<for _hgtsidx = 0; _hgtsidx < $HGTrainSlavesIDs.length; _hgtsidx++>> - <<if $slaves[$i].ID == $HGTrainSlavesIDs[_hgtsidx].ID>> - <<set $activeSlave = $slaves[$i], $HGtraining = $HGTrainSlavesIDs[_hgtsidx].training>> - <<include "HG Application">> - <br> - <</if>> -<</for>> - - <<= App.SlaveAssignment.devotion($slaves[$i])>> diff --git a/src/uncategorized/hgApplication.tw b/src/uncategorized/hgApplication.tw deleted file mode 100644 index c5b39589583edfcd96b9386303845d1742b8b0b8..0000000000000000000000000000000000000000 --- a/src/uncategorized/hgApplication.tw +++ /dev/null @@ -1,441 +0,0 @@ -:: HG Application [nobr] - -<<setLocalPronouns _S.HeadGirl>> -<<setLocalPronouns $activeSlave 2>> - -<<if ndef $HGSeverity>> - <<set $HGSeverity = 0>> -<</if>> - -<<set $activeSlave.training = Math.clamp($activeSlave.training, 0, 150)>> -<<set _effectiveness = _S.HeadGirl.actualAge+((_S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant)/3)-(_S.HeadGirl.accent*5)+($HGSeverity*10)+(($activeSlave.intelligence+$activeSlave.intelligenceImplant)/4)-($activeSlave.accent*5)>> -<<if $AgePenalty == 0>> - <<set _effectiveness += Math.max(0,(30-_S.HeadGirl.actualAge))>> -<</if>> -<<if _S.HeadGirl.sexualFlaw == "abusive" && $HGSeverity >= 0>> - <<set _effectiveness += 10>> -<</if>> -<<if $HGtraining != "health">> - <<set $activeSlave.health.tired += 25>> -<</if>> - - <span style="font-weight: bold">Your Head Girl</span> <span class='slave-name'>_S.HeadGirl.slaveName</span> notices that <span class='slave-name'>$activeSlave.slaveName</span> -<<switch $HGtraining>> -<<case "health">> - is unwell. -<<case "obedience">> - is disobedient. -<<case "paraphilia">> - has a paraphilia. -<<case "flaw">> - has an unpleasant flaw worth fixing. -<<case "soften">> - has an unpleasant flaw that $he can try to soften into a unique quirk. -<<case "oral skill">> - isn't as orally skilled as $he is. -<<case "anal skill">> - isn't as skilled at taking anal as $he is. -<<case "fuck skill">> - isn't as skilled at vaginal intercourse as $he is. -<<case "whore skill">> - isn't as skilled at the fine art of sex for money as $he is. -<<case "entertain skill">> - isn't as skilled at entertainment as $he is. -<</switch>> - -<<if $HGtraining == "health">> - -$He helps $activeSlave.slaveName however $he can. The tender care has @@.green;improved $activeSlave.slaveName's health.@@ -<<run improveCondition($activeSlave, 10)>> -<<set $activeSlave.health.tired = Math.clamp($activeSlave.health.tired-10, 0, 1000)>> -<<set $activeSlave.training = 0>> - -<<else>> - -<<if _S.HeadGirl.career == "an arcology owner">> - $He was once an arcology owner $himself, making $him truly peerless as a Head Girl. - <<set _effectiveness += 50>> -<<elseif setup.HGCareers.includes(_S.HeadGirl.career)>> - $He was used to giving commands and being obeyed in $his life before $he was a slave, experience $he can call on now. - <<set _effectiveness += 5>> -<<elseif _S.HeadGirl.skill.headGirl >= $masteredXP>> - $He is used to giving commands and being obeyed through experience, rendering $him more effective. - <<set _effectiveness += 5>> -<</if>> - -<<if _S.HeadGirl.actualAge > 30>> - $His age and experience help $him as $he works with $activeSlave.slaveName. -<<elseif _S.HeadGirl.actualAge < 25 && $AgePenalty > 0>> - $His youth and inexperience impede $him as $he works with $activeSlave.slaveName. -<</if>> - -<<if _S.HeadGirl.accent >= 3>> - $He does $his best to give orders in $language, but has to resort to a lot of unseemly gesticulation and shouting, making $him much less effective. -<<elseif _S.HeadGirl.accent == 2>> - $His heavy <<print aNational(_S.HeadGirl.nationality)>> accent impedes $his clarity in $language, making $him somewhat less effective. -<</if>> - -<<if ($HGtraining == "obedience") || ($HGtraining == "flaw") || ($HGtraining == "soften")>> - <<if _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant > 50>> - <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>> - $He needs $his wits about $him to mold $activeSlave.slaveName, who's quite intelligent _himself2. - <<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -50>> - $His intelligence helps $him mold $activeSlave.slaveName. - <<else>> - Molding $activeSlave.slaveName is very easy, especially for a smart Head Girl like $him. - <</if>> - <</if>> -<<else>> - <<if _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant > 50>> - <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>> - Both slaves are quite intelligent, making $his job much easier. - <<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant >= -50>> - $He's quite intelligent and can teach $activeSlave.slaveName well. - <<else>> - $He needs all $his considerable intelligence to get through to the idiot $he has to teach. - <</if>> - <</if>> -<</if>> - -<<if $HGSeverity > 0>> - Your directives encourage $him to rape any slave that fails in the slightest way, a task $he approaches - <<if _S.HeadGirl.sexualFlaw == "abusive">> - eagerly, since $he prefers to take $his pleasure without consent. - <<elseif _S.HeadGirl.fetish == "sadist">> - with sadistic enthusiasm. - <<elseif _S.HeadGirl.fetish == "dom">> - with confidence. - <<elseif _S.HeadGirl.energy > 95>> - as a convenient way to - <<if (_S.HeadGirl.balls > 0)>> - drain $his perpetually overfilled balls into a series of spasming holes. - <<else>> - sate $his excess sexual appetite. - <</if>> - <<else>> - dutifully. - <</if>> - <<if $activeSlave.vagina == 0>> - In $activeSlave.slaveName's case, $he's careful to limit _his2 sexual abuse to things that won't take the _girl2's virginity. The slave - <<elseif $activeSlave.anus == 0>> - $He's careful to molest $activeSlave.slaveName in ways that don't involve penetrating _his2 virgin ass. The slave - <<else>> - $activeSlave.slaveName - <</if>> - <<if $activeSlave.devotion > 50>> - accepts the abuse, believing _he2 deserves to be raped. - <<elseif $activeSlave.devotion >= -20>> - is @@.gold;frightened@@ by the unceasing abuse. - <<set $activeSlave.trust -= 1>> - <<else>> - @@.mediumorchid;hates@@ and @@.gold;fears@@ the constant abuse. - <<set $activeSlave.trust -= 1>> - <<set $activeSlave.devotion -= 1>> - <</if>> - _S.HeadGirl.slaveName makes sure $his victim hates it, every time, and $activeSlave.slaveName can't help but do _his2 very best to avoid this treatment. -<<elseif $HGSeverity == 0>> - You allow $him to use $his own judgment when punishing failures, - <<if _S.HeadGirl.sexualFlaw == "abusive">> - and $he usually decides in favor of forcing misbehaving slaves to get $him off. - <<elseif _S.HeadGirl.fetish == "sadist">> - permission the sadist uses for $his own gratification. - <<elseif _S.HeadGirl.fetish == "dom">> - which the dominant $girl uses confidently. - <<elseif _S.HeadGirl.energy > 95>> - which $he uses to - <<if (_S.HeadGirl.balls > 0)>> - force $his subordinates to keep $his balls drained. - <<else>> - extract the constant sexual favors $his libido demands. - <</if>> - <<else>> - and $he does $his best to be fair. - <</if>> - $activeSlave.slaveName - <<if $activeSlave.devotion > 50>> - is @@.mediumaquamarine;grateful@@ that _he2 is punished justly when _he2 makes mistakes. - <<set $activeSlave.trust += 1>> - <<elseif $activeSlave.devotion >= -20>> - does _his2 best to learn quickly and avoid punishment. - <<else>> - is @@.gold;scared@@ by _his2 inability to get away with the smallest disobedience. - <<set $activeSlave.trust -= 1>> - <</if>> -<<else>> - You require $him to use respect when punishing; $he does $his best to motivate, but is unable to use real fear as a tool. $activeSlave.slaveName understands this, and @@.mediumaquamarine;trusts@@ that if _he2 fails, the consequences won't be too awful. - <<set $activeSlave.trust += 1>> -<</if>> - -<<if $HGtraining == "obedience">> - -<<set $activeSlave.training = 0>> -<<set _effectiveness -= ($activeSlave.intelligence+$activeSlave.intelligenceImplant)/3>> -<<if _effectiveness <= 0>> - $activeSlave.slaveName is smart enough to complicate things; _he2 manages to outwit $him this week and makes no progress. -<<else>> - <<set $activeSlave.devotion += Math.ceil(_effectiveness/4)>> - <<if $activeSlave.devotion < -50>> - $He helps watch and restrain the rebellious $activeSlave.slaveName, helping wear _him2 down, @@.gold;breaking $activeSlave.slaveName's rebelliousness.@@ - <<elseif $activeSlave.devotion < -20>> - $He keeps $activeSlave.slaveName constantly aware of _his2 slavery, @@.gold;breaking $activeSlave.slaveName's resistance.@@ - <<else>> - $He acts as another pair of eyes watching $activeSlave.slaveName and metes out punishments, @@.gold;improving $activeSlave.slaveName's servitude.@@ - <</if>> -<</if>> - -<<elseif $HGtraining == "paraphilia">> - -<<set _effectiveness -= ($activeSlave.intelligence+$activeSlave.intelligenceImplant)/3>> -<<set $activeSlave.training += _effectiveness>> -_S.HeadGirl.slaveName does $his best to get $activeSlave.slaveName past it with punishments and rewards, -<<if $activeSlave.training > 100>> - and @@.green;resolves $activeSlave.slaveName's paraphilia.@@ - <<set $activeSlave.training = 0>> - <<set $activeSlave.sexualFlaw = "none">> -<<else>> - and makes partial progress. -<</if>> - -<<elseif $HGtraining == "flaw">> - -<<set _effectiveness -= ($activeSlave.intelligence+$activeSlave.intelligenceImplant)/3>> -<<set $activeSlave.training += _effectiveness>> -_S.HeadGirl.slaveName punishes $activeSlave.slaveName whenever $he catches _him2 indulging in _his2 bad habits, -<<if $activeSlave.training > 100>> - and @@.green;fixes $activeSlave.slaveName's flaw.@@ - <<set $activeSlave.training = 0>> - <<if $activeSlave.behavioralFlaw != "none">> - <<set $activeSlave.behavioralFlaw = "none">> - <<elseif $activeSlave.sexualFlaw != "none">> - <<set $activeSlave.sexualFlaw = "none">> - <</if>> -<<else>> - and makes partial progress. -<</if>> - -<<elseif $HGtraining == "soften">> - -<<set _effectiveness -= ($activeSlave.intelligence+$activeSlave.intelligenceImplant)/3>> -<<set $activeSlave.training += _effectiveness>> -$He punishes $activeSlave.slaveName whenever $he sees _him2 breaking the rules yet does $his best to retain what makes the slave special, -<<if $activeSlave.training > 150>> - <<set $activeSlave.training = 0>> - and successfully @@.green;softens $activeSlave.slaveName's flaw.@@ - <<if $activeSlave.behavioralFlaw != "none">> - <<run SoftenBehavioralFlaw($activeSlave)>> - <<elseif $activeSlave.sexualFlaw != "none">> - <<run SoftenSexualFlaw($activeSlave)>> - <</if>> -<<else>> - and makes partial progress. -<</if>> - -<<elseif $HGtraining == "oral skill">> - -<<set $activeSlave.training = 0>> -<<if (_S.HeadGirl.fetish == "cumslut") && (_S.HeadGirl.fetishStrength > 60)>> - In spare moments $he teaches $activeSlave.slaveName how to suck cocks, cunts, and assholes. $His enthusiasm for oral sex is infectious. $activeSlave.slaveName's @@.green;oral skills have improved.@@ - <<= slaveSkillIncrease('oral', $activeSlave, random(5,10))>> -<<elseif (_S.HeadGirl.dick > 0) && canPenetrate(_S.HeadGirl)>> - In spare moments $he teaches $activeSlave.slaveName how to suck cocks, cunts, and assholes. Your Head Girl uses $his penis as an effective teaching tool. $activeSlave.slaveName's @@.green;oral skills have improved.@@ - <<= slaveSkillIncrease('oral', $activeSlave, random(5,10))>> -<<elseif (_S.HeadGirl.clit > 2)>> - In spare moments $he teaches $activeSlave.slaveName how to suck cocks, cunts, and assholes. Your Head Girl uses $his pseudophallus-sized clit as an effective teaching tool. $activeSlave.slaveName's @@.green;oral skills have improved.@@ - <<= slaveSkillIncrease('oral', $activeSlave, random(5,10))>> -<<else>> - In spare moments $he teaches $activeSlave.slaveName how to suck cocks, cunts, and assholes. $activeSlave.slaveName's @@.green;oral skills have improved.@@ -<</if>> -<<= slaveSkillIncrease('oral', $activeSlave, Math.ceil(_effectiveness/10))>> - -<<elseif $HGtraining == "anal skill">> - -<<set $activeSlave.training = 0>> -<<if (_S.HeadGirl.fetish == "buttslut") && (_S.HeadGirl.fetishStrength > 60)>> - In spare moments $he teaches $activeSlave.slaveName how to take it up the ass. Your Head Girl's enthusiasm for backdoor loving is infectious. $activeSlave.slaveName's @@.green;anal skills have improved.@@ - <<= slaveSkillIncrease('anal', $activeSlave, random(5,10))>> -<<elseif (_S.HeadGirl.dick > 0) && canPenetrate(_S.HeadGirl)>> - In spare moments $he teaches $activeSlave.slaveName how to take a dick up the butt. Your Head Girl uses $his penis as an effective teaching tool. $activeSlave.slaveName's @@.green;anal skills have improved.@@ - <<= slaveSkillIncrease('anal', $activeSlave, random(5,10))>> -<<elseif (_S.HeadGirl.clit > 2)>> - In spare moments $he teaches $activeSlave.slaveName how to take a phallus up the butt. Your Head Girl uses $his pseudophallus-sized clit as an effective teaching tool. $activeSlave.slaveName's @@.green;anal skills have improved.@@ - <<= slaveSkillIncrease('anal', $activeSlave, random(5,10))>> -<<else>> - In spare moments $he teaches $activeSlave.slaveName how to take a dick up the butt. $activeSlave.slaveName's @@.green;anal skills have improved.@@ -<</if>> -<<= slaveSkillIncrease('anal', $activeSlave, Math.ceil(_effectiveness/10))>> - -<<elseif $HGtraining == "fuck skill">> - -<<set $activeSlave.training = 0>> -<<if (_S.HeadGirl.energy > 95)>> - In spare moments $he teaches $activeSlave.slaveName how to take a dick. Your Head Girl's enthusiasm for sex is infectious. $activeSlave.slaveName's @@.green;vanilla sex skills have improved.@@ - <<= slaveSkillIncrease('vaginal', $activeSlave, random(5,10))>> -<<elseif (_S.HeadGirl.dick > 0) && canPenetrate(_S.HeadGirl)>> - In spare moments $he teaches $activeSlave.slaveName how to take a dick. Your Head Girl uses $his penis as an effective teaching tool. $activeSlave.slaveName's @@.green;vanilla sex skills have improved.@@ - <<= slaveSkillIncrease('vaginal', $activeSlave, random(5,10))>> -<<elseif (_S.HeadGirl.clit > 2)>> - In spare moments $he teaches $activeSlave.slaveName how to take a phallus. Your Head Girl uses $his pseudophallus-sized clit as an effective teaching tool. $activeSlave.slaveName's @@.green;vanilla sex skills have improved.@@ - <<= slaveSkillIncrease('vaginal', $activeSlave, random(5,10))>> -<<else>> - In spare moments $he teaches $activeSlave.slaveName how to take a dick. $activeSlave.slaveName's @@.green;vanilla sex skills have improved.@@ -<</if>> -<<= slaveSkillIncrease('vaginal', $activeSlave, Math.ceil(_effectiveness/10))>> - -<<elseif $HGtraining == "whore skill">> - -<<set $activeSlave.training = 0>> -In spare moments $he teaches $activeSlave.slaveName how to prostitute _himself2. $activeSlave.slaveName's @@.green;whoring skills have improved.@@ -<<= slaveSkillIncrease('whoring', $activeSlave, Math.ceil(_effectiveness/10))>> - -<<elseif $HGtraining == "entertain skill">> - -<<set $activeSlave.training = 0>> -<<if (_S.HeadGirl.fetish == "humiliation") && (_S.HeadGirl.fetishStrength > 60)>> - In spare moments $he teaches $activeSlave.slaveName how to entertain. Your Head Girl's enthusiasm for public display is infectious. $activeSlave.slaveName's @@.green;entertainment skills have improved.@@ - <<= slaveSkillIncrease('entertainment', $activeSlave, random(5,10))>> -<<else>> - In spare moments $he teaches $activeSlave.slaveName how to entertain. $activeSlave.slaveName's @@.green;entertainment skills have improved.@@ -<</if>> -<<= slaveSkillIncrease('entertainment', $activeSlave, Math.ceil(_effectiveness/10))>> - -<</if>> -<</if>> - -<<if ($activeSlave.devotion >= -20)>> -<<if ($activeSlave.attrKnown == 0)>> - <<set $activeSlave.attrKnown = 1>> - _S.HeadGirl.slaveName also investigates the slave's basic sexual orientation, finding that _he2 is - <<if ($activeSlave.attrXY <= 40)>> - @@.red;disgusted by men@@ - <<elseif ($activeSlave.attrXY <= 60)>> - indifferent to men - <<elseif ($activeSlave.attrXY <= 80)>> - @@.green;attracted to men@@ - <<else>> - @@.green;intensely attracted to men@@ - <</if>> - and - <<if ($activeSlave.attrXX <= 40)>> - @@.red;disgusted by women.@@ - <<elseif ($activeSlave.attrXX <= 60)>> - indifferent to women. - <<elseif ($activeSlave.attrXX <= 80)>> - @@.green;attracted to women.@@ - <<else>> - @@.green;intensely attracted to women.@@ - <</if>> -<</if>> -<</if>> - -<<if $HGPiercings>> - <<if $activeSlave.devotion >= -20 && $activeSlave.genes == "XY" && $activeSlave.attrXY <= 35 && $arcologies[0].FSBodyPurist == "unset" && ($arcologies[0].FSPaternalist == "unset" || ($arcologies[0].FSPaternalist != "unset" && SlaveStatsChecker.modScore($activeSlave).total < 13))>> - <<set _piercingForbidden = 0>> - <<for _i = 0; _i < 1; _i++>> - <<if $activeSlave.earPiercing == 0 && $activeSlave.earShape !== "none">> - <<if $arcologies[0].FSDegradationist != "unset">> - <<set $activeSlave.earPiercing = 2>> - <<else>> - <<set $activeSlave.earPiercing = 1>> - <</if>> - <<run RulesDeconfliction($activeSlave)>> - <<if $activeSlave.earPiercing != $slaveAfterRA.earPiercing>> - <<set _piercingForbidden = 1, $activeSlave.earPiercing = 0>> - <<else>> - <<if $arcologies[0].FSDegradationist != "unset">> - _S.HeadGirl.slaveName knows that $activeSlave.slaveName needs to adjust to life as a slave _girl2, so $he has the slave's ears pierced. This will be a constant reminder that _he2 is simply a sexual object here. - <<else>> - _S.HeadGirl.slaveName knows that $activeSlave.slaveName needs help adjusting to life as a slave _girl2, so $he has the slave's ears pierced. A little feminine touch can make a big difference. - <</if>> - <<run cashX(forceNeg($modCost), "slaveMod", $activeSlave)>> - <<break>> - <</if>> - <</if>> - <<if $activeSlave.nosePiercing == 0>> - <<if $arcologies[0].FSDegradationist != "unset">> - <<set $activeSlave.nosePiercing = 2>> - <<else>> - <<set $activeSlave.nosePiercing = 1>> - <</if>> - <<run RulesDeconfliction($activeSlave)>> - <<if $activeSlave.nosePiercing != $slaveAfterRA.nosePiercing>> - <<set _piercingForbidden = 1, $activeSlave.nosePiercing = 0>> - <<else>> - <<if $arcologies[0].FSDegradationist != "unset">> - _S.HeadGirl.slaveName knows that $activeSlave.slaveName needs to adjust to life as a slave _girl2, so $he gives the slave nasal studs and a large septum ring. It should push $activeSlave.slaveName to see _himself2 as a sexual object for others to use. - <<else>> - _S.HeadGirl.slaveName knows that $activeSlave.slaveName needs help adjusting to life as a slave _girl2, so $he gives the slave a cute little nose piercing. It should help $activeSlave.slaveName see _himself2 as a bit more feminine. - <</if>> - <<run cashX(forceNeg($modCost), "slaveMod", $activeSlave)>> - <<break>> - <</if>> - <</if>> - <<if $activeSlave.eyebrowPiercing == 0>> - <<if $arcologies[0].FSDegradationist != "unset">> - <<set $activeSlave.eyebrowPiercing = 2>> - <<else>> - <<set $activeSlave.eyebrowPiercing = 1>> - <</if>> - <<run RulesDeconfliction($activeSlave)>> - <<if $activeSlave.eyebrowPiercing != $slaveAfterRA.eyebrowPiercing>> - <<set _piercingForbidden = 1, $activeSlave.eyebrowPiercing = 0>> - <<else>> - <<if $arcologies[0].FSDegradationist != "unset">> - _S.HeadGirl.slaveName knows that $activeSlave.slaveName needs to adjust to life as a slave _girl2, so $he gives the slave multiple eyebrow piercings. A slutty touch for a slave _girl2 should help _him2 feel a little hungrier for cock. - <<else>> - _S.HeadGirl.slaveName knows that $activeSlave.slaveName needs help adjusting to life as a slave _girl2, so $he gives the slave a cute little eyebrow piercing. A slutty touch for a slave _girl2 should help _him2 feel a little hungrier for cock. - <</if>> - <<run cashX(forceNeg($modCost), "slaveMod", $activeSlave)>> - <<break>> - <</if>> - <</if>> - <<if $activeSlave.lipsPiercing == 0>> - <<if $arcologies[0].FSDegradationist != "unset">> - <<set $activeSlave.lipsPiercing = 2>> - <<else>> - <<set $activeSlave.lipsPiercing = 1>> - <</if>> - <<run RulesDeconfliction($activeSlave)>> - <<if $activeSlave.lipsPiercing != $slaveAfterRA.lipsPiercing>> - <<set _piercingForbidden = 1, $activeSlave.lipsPiercing = 0>> - <<else>> - <<if $arcologies[0].FSDegradationist != "unset">> - _S.HeadGirl.slaveName knows that $activeSlave.slaveName needs to adjust to life as a slave _girl2, so $he has the slave's lower lip pierced. _His2 mouth is for pleasing penises now, so it'll help _him2 if it looks like it. - <<else>> - _S.HeadGirl.slaveName knows that $activeSlave.slaveName needs help adjusting to life as a slave _girl2, so $he has the slave's lower lip pierced. _His2 mouth is for pleasing penises now, so it'll help _him2 if it looks like it. - <</if>> - <<run cashX(forceNeg($modCost), "slaveMod", $activeSlave)>> - <<break>> - <</if>> - <</if>> - <<if $activeSlave.navelPiercing == 0>> - <<if $arcologies[0].FSDegradationist != "unset">> - <<set $activeSlave.navelPiercing = 2>> - <<else>> - <<set $activeSlave.navelPiercing = 1>> - <</if>> - <<run RulesDeconfliction($activeSlave)>> - <<if $activeSlave.navelPiercing != $slaveAfterRA.navelPiercing>> - <<set _piercingForbidden = 1, $activeSlave.navelPiercing = 0>> - <<else>> - <<if $arcologies[0].FSDegradationist != "unset">> - _S.HeadGirl.slaveName knows that $activeSlave.slaveName needs help adjusting to life as a slave _girl2, so $he has the slave's navel pierced with a big ring. Whatever _he2 thinks in _his2 mind, _S.HeadGirl.slaveName makes clear to _him2 that _his2 body belongs to you. - <<else>> - _S.HeadGirl.slaveName knows that $activeSlave.slaveName needs help adjusting to life as a slave _girl2, so $he has the slave's navel pierced. The prettier _his2 lower half looks, the less reluctant _he2 should feel to take it up the butt. - <</if>> - <<run cashX(forceNeg($modCost), "slaveMod", $activeSlave)>> - <<break>> - <</if>> - <</if>> - <<break>> - <</for>> - <<if _piercingForbidden>> - <<if $arcologies[0].FSDegradationist != "unset">> - _S.HeadGirl.slaveName thinks some piercings might push $activeSlave.slaveName to adjust to life as a slave _girl2, but $he also knows you have rules applied to this slave that forbid it. - <<else>> - _S.HeadGirl.slaveName thinks some cute piercings might help $activeSlave.slaveName adjust to life as a slave _girl2, but $he also knows you have rules applied to this slave that forbid it. - <</if>> - <</if>> - <</if>> -<</if>> - -<<set $slaves[$slaveIndices[$activeSlave.ID]] = $activeSlave>> /* save changes */ diff --git a/src/uncategorized/penthouseReport.tw b/src/uncategorized/penthouseReport.tw deleted file mode 100644 index 8119bfbbce3a0627c94ccc60c6b6057dd1b48e86..0000000000000000000000000000000000000000 --- a/src/uncategorized/penthouseReport.tw +++ /dev/null @@ -1,44 +0,0 @@ -:: Penthouse Report [nobr] - -<<set _SL = $slaves.length>> - -<<set _HGSuitSlaves = App.Utils.jobForAssignment(Job.HEADGIRLSUITE).employees()>> - -<<for $i = 0; $i < _SL; $i++>> - <<if assignmentVisible($slaves[$i])>> - <div> - <<includeDOM App.EndWeek.favoriteIcon($slaves[$i])>> - <span class='slave-name'><<= SlaveFullName($slaves[$i])>></span> - <<if $slaves[$i].choosesOwnAssignment == 2>> - <<= App.SlaveAssignment.choosesOwnJob($slaves[$i])>> - $He - <</if>> - <<include "Full Report">> - <br><br> - - <<if ($slaves[$i].ID == $HeadGirlID) && (_HGSuitSlaves.length > 0)>> - /% We found the Head Girl, now let's find her slave %/ - <<set _iTemp = $i>> - <<set _ID = _HGSuitSlaves[0].ID, $i = $slaveIndices[_ID]>> - - <<if $slaves[$i].assignment != "live with your Head Girl">> - <br>@@.red;$slaves[$i].slaveName had been assigned to live with your Head Girl, but this week $he was assigned to $slaves[$i].assignment. $He has been released to your penthouse for reassignment.@@ - <<= removeJob($slaves[$i], "live with your Head Girl")>> - <<else>> - <span class='slave-name'><<= SlaveFullName($slaves[$i])>></span> - <<if $slaves[$i].choosesOwnAssignment == 2>> - <<= App.SlaveAssignment.choosesOwnJob($slaves[$i])>> - $He - <</if>> - <<includeDOM App.SlaveAssignment.liveWithHG($slaves[$i])>> - <br><br> - <</if>> - - <<set $i = _iTemp>> - <</if>> - <br style="clear: both;"></div> - <</if>> -<</for>> - -/* count open spots in facilities after all assignments have been decided for the week */ -<<set $brothelSpots = App.Entity.facilities.brothel.freeSpace, $clubSpots = App.Entity.facilities.club.freeSpace, $dairySpots = App.Entity.facilities.dairy.freeSpace, $servantsQuartersSpots = App.Entity.facilities.servantsQuarters.freeSpace>> diff --git a/src/uncategorized/spaReport.tw b/src/uncategorized/spaReport.tw deleted file mode 100644 index 0ea1ed2eaaefe49c2f8cfe4fc76b5d65296e5c6d..0000000000000000000000000000000000000000 --- a/src/uncategorized/spaReport.tw +++ /dev/null @@ -1,376 +0,0 @@ -:: Spa Report [nobr] - -<<set _slaves = App.Utils.sortedEmployees(App.Entity.facilities.spa)>> -<<set _DL = _slaves.length, _SL = $slaves.length, _bonusToggle = 0, _healthBonus = 0, _idleBonus = 0, _restedSlaves = 0, _trustBonus = 0>> - -<<if $spaDecoration != "standard">> - <<set _devBonus = 1>> -<<else>> - <<set _devBonus = 0>> -<</if>> -<<set $flSex = App.EndWeek.getFLSex(App.Entity.facilities.spa)>> /* FIXME: should be local, passed as a parameter to saRules */ - -<<if $AttendantID != 0>> - <<if (_S.Attendant.health.condition < 100)>> - <<run improveCondition(_S.Attendant, normalRandInt(20))>> - <</if>> - <<if (_S.Attendant.devotion <= 60)>> - <<set _S.Attendant.devotion++>> - <</if>> - <<if _S.Attendant.trust < 60>> - <<set _S.Attendant.trust++>> - <</if>> - <<if _S.Attendant.rules.living != "luxurious">> - <<set _S.Attendant.rules.living = "luxurious">> - <</if>> - <<set _FLsFetish = 0>> - <<if _S.Attendant.fetishStrength <= 95>> - <<if _S.Attendant.fetish != "submissive">> - <<if fetishChangeChance(_S.Attendant) > random(0,100)>> - <<set _FLsFetish = 1, _S.Attendant.fetishKnown = 1, _S.Attendant.fetish = "submissive">> - <</if>> - <<elseif _S.Attendant.fetishKnown == 0>> - <<set _FLsFetish = 1, _S.Attendant.fetishKnown = 1>> - <<else>> - <<set _FLsFetish = 2, _S.Attendant.fetishStrength += 4>> - <</if>> - <</if>> - <<if (_S.Attendant.fetish == "none") || (_S.Attendant.fetish == "submissive")>> - <<set _devBonus++>> - <</if>> - <<set _S.Attendant.devotion += _devBonus>> - <<setLocalPronouns _S.Attendant>> - <<= SlaveFullName(_S.Attendant)>> is serving as the spa attendant.<<if _S.Attendant.relationship == -3 && _S.Attendant.devotion > 50>> $He tries $his best to be your perfect attentive, caring and loving $wife.<</if>> - <<if (_FLsFetish == 1)>> - When $he is paid a visit by a slave with sexual issues to work out, $he provides them with an understanding, willing, giving partner. $He finds real satisfaction in helping your slaves find sexual gratification, and @@.lightsalmon;becomes a submissive.@@ - <<elseif (_FLsFetish == 2)>> - Every new slave in the spa is a new person $he gets to connect with and serve. Sexually. @@.lightsalmon;$He becomes more submissive.@@ - <</if>> - <<if setup.attendantCareers.includes(_S.Attendant.career)>> - $He has experience with counseling from $his life before $he was a slave, making $him better at building rapport with troubled slaves, and giving $him a better chance of softening flaws into beneficial quirks. - <<set _bonusToggle = 1, _idleBonus++>> - <<elseif _S.Attendant.skill.attendant >= $masteredXP>> - $He has experience with counseling from working for you, making $him better at building rapport with troubled slaves, and giving $him a better chance of softening flaws into beneficial quirks. - <<set _bonusToggle = 1, _idleBonus++>> - <<else>> - <<set _S.Attendant.skill.attendant += random(1,Math.ceil((_S.Attendant.intelligence+_S.Attendant.intelligenceImplant)/15) + 8)>> - <</if>> - <<if !canSee(_S.Attendant)>> - $His blindness allows $him to deeply connect with $his charges. - <<set _idleBonus++>> - <</if>> - <<if (_S.Attendant.fetish == "none")>> - _S.Attendant.slaveName respects the slaves lounging in the spa, allowing them to relax completely. - <<set _idleBonus++>> - <<elseif (_S.Attendant.fetish == "submissive")>> - _S.Attendant.slaveName lets the slaves resting in the spa take the lead sexually, doing $his best to please them. - <<set _idleBonus++>> - <<elseif (_S.Attendant.fetishKnown == 1)>> - _S.Attendant.slaveName can't keep $his hand<<if hasBothArms(_S.Attendant)>>s<</if>> to $himself, preventing the slaves in the spa from relaxing completely. - <</if>> - <<if (_S.Attendant.visualAge > 35)>> - $His apparent maturity encourages the slaves in the spa to relax and pour out their troubles to $him. - <<set _healthBonus++, _idleBonus++>> - <</if>> - <<if (_S.Attendant.intelligence+_S.Attendant.intelligenceImplant > 15)>> - $He's so intelligent $he can suss out the cause of slaves' emotional issues and counsel them effectively. - <<set _idleBonus++>> - <</if>> - <<if isFertile(_S.Attendant) || (_S.Attendant.bellyPreg >= 1500) || (_S.Attendant.counter.birthsTotal > 0) || (_S.Attendant.bellyImplant >= 1500)>> - $He has a natural mothering instinct and really makes $his charges feel at home. - <<set _idleBonus++, _healthBonus++>> - <</if>> - <<set _attendantUsedCure = 0>> - <<for _slave range _slaves>> - <<set $i = $slaveIndices[_slave.ID]>> - <<setLocalPronouns _slave 2>> - <<if (_slave.fetish == "mindbroken") && (_slave.health.condition > 20) && (_attendantUsedCure == 0) && ($spaFix != 2)>> - <<set _attendantUsedCure = 1>> - <<if (random(1,100) > 90-_S.Attendant.devotion)>> - <br> @@.green;Something almost miraculous has happened.@@ _S.Attendant.slaveName has always refused to believe that _slave.slaveName could not be reached, and has lavished patient tenderness on _him2 in $spaName. _slave.slaveName has begun to respond, and is stirring from _his2 mental torpor. - <<set _slave.devotion = -3, _slave.sexualFlaw = "apathetic", _slave.behavioralFlaw = either("hates men", "odd"), _slave.fetish = "none", _slave.fetishKnown = 1>> - <<set _spr = $genePool.findIndex(function(s) { return s.ID == _slave.ID; })>> - <<if $genePool[_spr].intelligence >= -95>> - <<set _slave.intelligence = $genePool[_spr].intelligence-30>> - <</if>> - <<if ($arcologies[0].FSPaternalist > 0)>> - Society @@.green;strongly approves@@ of _slave.slaveName being restored to sanity, which advances ideals about enlightened slaveownership. - <<set $arcologies[0].FSPaternalist += 0.01*$FSSingleSlaveRep>> - <<run repX(2*$FSSingleSlaveRep*($arcologies[0].FSPaternalist/$FSLockinLevel), "spa", _slave)>> - <</if>> - <</if>> - <</if>> - <<set _seed = _bonusToggle * 10>> - <<if _bonusToggle == 1 && _slave.trust < 60>> - <<set _slave.trust++>> - <</if>> - <<if _S.Attendant.rivalryTarget == _slave.ID>> - $He constantly harasses $his <<print rivalryTerm(_S.Attendant)>>, _slave.slaveName, preventing _him2 from getting comfortable and forcing _him2 to keep _his2 guard up. - <<set _slave.devotion -= 4, _slave.trust -= 4>> - <<if random(1,100) > 35>> - <<set _S.Attendant.rivalry++, _S.Attendant.rivalry++, _slave.rivalry++>> - <</if>> - <<elseif _S.Attendant.relationshipTarget == _slave.ID>> - $He dedicates most of $his attention to $his <<print relationshipTerm(_S.Attendant)>>, _slave.slaveName, making _his2 stress, both physical and mental, wash away. - <<set _slave.devotion += 3, _slave.trust += 3>> - <<elseif areRelated(_S.Attendant, _slave)>> - $He makes sure to spend extra time caring for $his <<print relativeTerm(_S.Attendant,_slave)>>, _slave.slaveName. - <<set _slave.trust++>> - <<run improveCondition(_slave, 1)>> - <</if>> - <<switch _slave.prestigeDesc>> - <<case "$He is a famed Free Cities whore, and commands top prices.">> - $He does $his best to relax the famous whore, _slave.slaveName, making sure to - <<if _slave.vagina > 2 || _slave.anus > 2>> - pay special attention to _his2 worn holes. - <<else>> - get _him2 clean and relaxed for _his2 next usage. - <</if>> - <<set _slave.devotion += 3, _slave.trust += 3>> - <<case "$He is a famed Free Cities slut, and can please anyone.">> - $He does $his best to soothe the famous entertainer, _slave.slaveName, letting _him2 relax in blissful peace. - <<set _slave.devotion += 3, _slave.trust += 3>> - <<case "$He is remembered for winning best in show as a cockmilker.">> - <<if (_slave.balls > 6) && (_slave.dick != 0)>> - <<if _S.Attendant.fetish == "cumslut">> - $He can't keep $his hand<<if hasBothArms(_S.Attendant)>>s<</if>> off _slave.slaveName's cock and balls, but _he2 doesn't mind being milked constantly. Before long, strands of cum can be found floating all throughout the bath. - <<set _S.Attendant.fetishStrength += 4>> - <<else>> - $He does $his best to accommodate _slave.slaveName's massive genitals and tends to _him2 whenever _he2 feels a need for release. - <<if random(1,100) > 65 && _S.Attendant.fetish == "none">> - After taking several massive loads to the face, _S.Attendant.slaveName begins to find satisfaction in being coated in cum. - <<set _S.Attendant.fetish = "cumslut">> - <</if>> - <</if>> - <</if>> - <<set _slave.devotion += 3, _slave.trust += 3>> - <<case "$He is remembered for winning best in show as a dairy cow.">> - <<if (_slave.lactation > 0) && ((_slave.boobs-_slave.boobsImplant) > 6000)>> - <<if _S.Attendant.fetish == "boobs">> - $He can't keep $his hand<<if hasBothArms(_S.Attendant)>>s<</if>> off _slave.slaveName's huge breasts, but _he2 doesn't mind being milked constantly. Before long the bath gains a white tint. - <<set _S.Attendant.fetishStrength += 4, _S.Attendant.fetishStrength += 4>> - <<else>> - $He does $his best to accommodate _slave.slaveName's massive breasts and tends to _him2 whenever _he2 feels a need for release. - <<if random(1,100) > 65 && _S.Attendant.fetish == "none">> - After multiple milking sessions, _S.Attendant.slaveName begins to find $himself fantasizing about having giant milky breasts too. - <<set _S.Attendant.fetish = "boobs">> - <</if>> - <</if>> - <<set _slave.devotion += 3, _slave.trust += 3, _slave.lactationDuration = 2, _slave.boobs -= _slave.boobsMilk, _slave.boobsMilk = 0>> - <</if>> - <<case "$He is remembered for winning best in show as a breeder.">> - <<if _slave.bellyPreg >= 5000>> - <<if _S.Attendant.fetish == "pregnancy">> - $He can't keep $his hand<<if hasBothArms(_S.Attendant)>>s<</if>> off _slave.slaveName's pregnancy, but _he2 doesn't mind _his2 full belly being fondled. - <<set _S.Attendant.fetishStrength += 4, _S.Attendant.fetishStrength += 4>> - <<else>> - $He does $his best to accommodate _slave.slaveName's pregnancy and to make sure the mother-to-be is happy and comfortable. - <<if random(1,100) > 65 && _S.Attendant.fetish == "none">> - After massaging _slave.slaveName's growing belly multiple times, _S.Attendant.slaveName begins to find $himself fantasizing about being swollen with life too. - <<set _S.Attendant.fetish = "pregnancy">> - <</if>> - <</if>> - <<set _slave.devotion += 3, _slave.trust += 3>> - <<else>> - <<if _S.Attendant.fetish == "pregnancy">> - $He can't help but pester _slave.slaveName with questions about _his2 famous pregnancy, limiting _his2 ability to truly relax. - <<set _slave.devotion += 1, _slave.trust += 1>> - <<elseif canGetPregnant(_slave)>> - $He does $his best to encourage _slave.slaveName's fertilization by performing any fertility boosting actions $he can. - <<set _slave.devotion += 3, _slave.trust += 3>> - <</if>> - <</if>> - <</switch>> - <<if (_S.Attendant.intelligence+_S.Attendant.intelligenceImplant > 15) && (_attendantUsedCure == 0) && ((_S.Attendant.intelligence+_S.Attendant.intelligenceImplant)+_seed) > random(1,200) && ($spaFix == 0)>> - <<if _slave.behavioralFlaw != "none">> - <<run SoftenBehavioralFlaw(_slave)>> - <<set _attendantUsedCure += 1>> - <br> _S.Attendant.slaveName works carefully with _slave.slaveName, and successfully @@.green;softens _his2 behavioral flaw@@ into an appealing quirk. - <<elseif _slave.sexualFlaw != "none">> - <<run SoftenSexualFlaw(_slave)>> - <<set _attendantUsedCure += 1>> - <br> _S.Attendant.slaveName works carefully with _slave.slaveName, and successfully @@.green;softens _his2 sexual flaw@@ into an appealing quirk. - <</if>> - <</if>> - <<if _slave.lactation > 0>> - _S.Attendant.slaveName takes care to keep _slave.slaveName's breasts comfortably drained. - <<set _slave.lactationDuration = 2, _slave.boobs -= _slave.boobsMilk, _slave.boobsMilk = 0>> - <</if>> - <</for>> - <<if (_DL < $spa)>> - <<set _seed = random(1,10)+(($spa-_DL)*(random(150,170)+(_idleBonus*10)))>> - <<run cashX(_seed, "spa", _S.Attendant)>> - <br> Since $he doesn't have enough slaves to occupy all $his time, the spa takes in citizens' slaves on a contract basis and $he helps them too, earning @@.yellowgreen;<<print cashFormat(_seed)>>.@@ - <<if ($arcologies[0].FSHedonisticDecadence > 0) && (_DL == 0)>> - Society @@.green;loves@@ being allowed to lounge in your spa, greatly advancing your laid back culture. - <<run FutureSocieties.Change("Hedonistic", 2)>> - <</if>> - <</if>> - <<if (_DL > 0)>><br><br><</if>> -<</if>> - -<<if (_DL > 0)>> - ''<<if (_DL > 1)>>There are _DL slaves<<else>>There is one slave<</if>> resting and recuperating in the spa.'' - <<if ($arcologies[0].FSHedonisticDecadence > 0) && (_DL == 0)>> - Society @@.green;approves@@ of your slaves being pampered this way, greatly advancing your laid back culture. - <<run FutureSocieties.Change("Hedonistic", 1)>> - <</if>> -<</if>> - -<<if _S.Attendant>> - <<set $i = $slaveIndices[$AttendantID]>> /* apply following SA passages to facility leader */ - <<if $showEWD != 0>> - <br><br> - /* 000-250-006 */ - <<if $seeImages && $seeReportImages>> - <div class="imageRef smlImg"> - <<= SlaveArt(_S.Attendant, 0, 0)>> - </div> - <</if>> - /* 000-250-006 */ - <<includeDOM App.EndWeek.favoriteIcon(_S.Attendant)>> - <span class='slave-name'><<= SlaveFullName(_S.Attendant)>></span> is serving as the Attendant in $spaName. - <br> - <<= App.SlaveAssignment.choosesOwnClothes(_S.Attendant)>> - <<run tired(_S.Attendant)>> - <<includeDOM App.SlaveAssignment.rules(_S.Attendant)>> - <<= App.SlaveAssignment.diet(_S.Attendant)>> - <<includeDOM App.SlaveAssignment.longTermEffects(_S.Attendant)>> - <<= App.SlaveAssignment.drugs(_S.Attendant)>> - <<= App.SlaveAssignment.relationships(_S.Attendant)>> - <<= App.SlaveAssignment.rivalries(_S.Attendant)>> - <br> <<= App.SlaveAssignment.devotion(_S.Attendant)>> - <<else>> - <<run App.SlaveAssignment.choosesOwnClothes(_S.Attendant)>> - <<run tired(_S.Attendant)>> - <<run App.SlaveAssignment.rules()>> - <<run App.SlaveAssignment.diet(_S.Attendant)>> - <<run App.SlaveAssignment.longTermEffects(_S.Attendant)>> - <<run App.SlaveAssignment.drugs(_S.Attendant)>> - <<run App.SlaveAssignment.relationships(_S.Attendant)>> - <<run App.SlaveAssignment.rivalries(_S.Attendant)>> - <<run App.SlaveAssignment.devotion(_S.Attendant)>> - <</if>> -<</if>> - -<<for _slave range _slaves>> - <<set $i = $slaveIndices[_slave.ID]>> - <<setLocalPronouns _slave>> - <<set _slave.devotion += _devBonus, _slave.trust += _trustBonus>> - <<run improveCondition(_slave, 5 + _healthBonus)>> - <<if (_slave.health.condition < -80)>> - <<run improveCondition(_slave, 15)>> - <<elseif _slave.health.condition < -40>> - <<run improveCondition(_slave, 10)>> - <<elseif _slave.health.condition < 0>> - <<run improveCondition(_slave, 5)>> - <</if>> - <<if ($spaUpgrade == 1) && (_slave.health.condition < 100)>> - <<run improveCondition(_slave, normalRandInt(8))>> - <</if>> - <<if (_slave.devotion < 60) && (_slave.trust < 60)>> - <<set _slave.devotion++, _slave.trust++>> - <<elseif (_slave.trust < 40)>> - <<set _slave.trust += 10>> - <<elseif (_slave.devotion < 40)>> - <<set _slave.devotion += 10>> - <</if>> - <<switch $spaDecoration>> - <<case "Chattel Religionist" "Chinese Revivalist">> - <<set _slave.rules.living = "normal">> - <<case "Degradationist">> - <<set _slave.rules.living = "spare">> - <<default>> - <<set _slave.rules.living = "luxurious">> - <</switch>> - <<if (_slave.health.condition >= 20) && (_slave.health.tired <= 30) && (_slave.trust > 60) && (_slave.devotion > 60) && (_slave.fetish != "mindbroken") && (_slave.sexualFlaw == "none") && (_slave.behavioralFlaw == "none")>> - <p> - <span class="slave-name">_slave.slaveName</span> is feeling well enough to leave $spaName, - <span class="noteworthy"> - <<if $assignmentRecords[_slave.ID]>> - <<set _oldJob = $assignmentRecords[_slave.ID]>> - <<= assignJobSafely(_slave, _oldJob)>> - <<if _slave.choosesOwnAssignment === 1>> - and $he is resting before choosing another task. - <<elseif _slave.assignment === "rest">> - <<if _oldJob != "rest">> - and since $he was unable to return to $his old task to <<print _oldJob>>, $his assignment has defaulted to rest. - <<else>> - so $he has returned to rest. - <</if>> - <<else>> - so $he goes back to <<print _slave.assignment>>. - <</if>> - <<else>> - so $his assignment has defaulted to rest. - <<= removeJob(_slave, "rest in the spa")>> - <</if>> - </span> - </p> - <<set _restedSlaves++, _DL--, _dI-->> - <<continue>> - <</if>> - <<if $showEWD != 0>> - <br><br> - /* 000-250-006 */ - <<if $seeImages && $seeReportImages>> - <div class="imageRef smlImg"> - <<= SlaveArt(_slave, 0, 0)>> - </div> - <</if>> - /* 000-250-006 */ - <<includeDOM App.EndWeek.favoriteIcon(_slave)>> - <span class='slave-name'><<= SlaveFullName(_slave)>></span> - <<if _slave.choosesOwnAssignment == 2>> - <<= App.SlaveAssignment.choosesOwnJob(_slave)>> - <<else>> - is resting in $spaName. - <</if>> - <br> $He <<= App.SlaveAssignment.rest(_slave)>> - <<if (_slave.fetish == "mindbroken")>> - $He remains in the Spa, completely mindbroken. - <<elseif(_slave.sexualFlaw != "none") || (_slave.behavioralFlaw != "none")>> - $He remains in the Spa, stubborn in $his flaw. - <<elseif (_slave.trust < 60) || (_slave.devotion < 60)>> - $He remains in the Spa, as $he is still learning to accept life as a slave. - <<elseif (_slave.health.condition < 20)>> - $He remains in the Spa, as $he is benefiting from its healing properties. - <<elseif (_slave.health.tired > 30)>> - $He remains in the Spa, continuing to soak away $his fatigue. - <</if>> - <br> - <<= App.SlaveAssignment.choosesOwnClothes(_slave)>> - <<includeDOM App.SlaveAssignment.rules(_slave)>> - <<= App.SlaveAssignment.diet(_slave)>> - <<includeDOM App.SlaveAssignment.longTermEffects(_slave)>> - <<= App.SlaveAssignment.drugs(_slave)>> - <<= App.SlaveAssignment.relationships(_slave)>> - <<= App.SlaveAssignment.rivalries(_slave)>> - <br> <<= App.SlaveAssignment.devotion(_slave)>> - <<else>> - <<run App.SlaveAssignment.choosesOwnJob(_slave)>> - <<run App.SlaveAssignment.choosesOwnClothes(_slave)>> - <<run App.SlaveAssignment.rest(_slave)>> - <<run App.SlaveAssignment.rules(_slave)>> - <<run App.SlaveAssignment.diet(_slave)>> - <<run App.SlaveAssignment.longTermEffects(_slave)>> - <<run App.SlaveAssignment.drugs(_slave)>> - <<run App.SlaveAssignment.relationships(_slave)>> - <<run App.SlaveAssignment.rivalries(_slave)>> - <<run App.SlaveAssignment.devotion(_slave)>> - <</if>> -<</for>> -<<if (_restedSlaves > 0)>> - <br><br> - <<if (_restedSlaves == 1)>> - One slave has rested until $he reached a state of @@.hotpink;devotion@@ and @@.mediumaquamarine;trust@@ and will leave the spa before the end of the week. - <<else>> - _restedSlaves slaves have rested until they reached a state of @@.hotpink;devotion@@ and @@.mediumaquamarine;trust@@ and will leave the spa before the end of the week. - <</if>> - <<if $spaDecoration != "standard">> - <br><br> <<= capFirstChar($spaName)>>'s $spaDecoration atmosphere @@.hotpink;had an impact on <<if _restedSlaves == 1>>$him while $he was<<else>>them while they were<</if>>@@ resting. - <</if>> -<</if>> -<<if _DL > 0 || _S.Attendant>> - <br><br> -<</if>>