code:
App.EndWeek.slaveAssignmentReport = function() {
	const facilities = App.Entity.facilities;
	const arcology = V.arcologies[0];

	// V.nextLink = "Economics";
	// V.nextButton = "Continue";

	const initialEmployeesCount = App.Utils.countFacilityWorkers(); // will be used to show differences after all the assignment changes
	const initialPenthouseTotalEmployeesCount = _countPenthousePopulation();

	/* Spa room */
	if (facilities.spa.established) {
		V.spaSpots = (facilities.spa.capacity - App.Entity.facilities.spa.employeesIDs().size) * 20;
		if (S.Attendant) {
			V.spaSpots = Math.trunc(V.spaSpots * (1 + (S.Attendant.skill.attendant / 400))); // A skilled attendant improves available space by 25%
		}
	}

	/** silent pass for any reassignments before generating reports */
	for (let i = 0; i < V.slaves.length; ++i) {
		// temp
		V.slaves[i].health.illness = 0;
		V.slaves[i].health.tired = 0;
		if (V.slaves[i].choosesOwnAssignment === 1) {
			V.i = i;
			App.UI.DOM.renderPassage("SA chooses own job");
		}
	}

	const res = document.createDocumentFragment();

	App.EndWeek.computeSexualServicesModel(res);

	res.appendChild(document.createElement("br"));
	res.appendChild(document.createElement("br"));

	const skillsToTest = {
		whoring: "whore",
		entertainment: "entertain",
		vaginal: "vaginal",
		anal: "anal",
		oral: "oral"
	};

	for (const slave of V.slaves) {
		for (const sk in skillsToTest) {
			if (_.isNil(slave.skill[sk])) {
				_printSlaveError(`Reset bad ${skillsToTest[sk]} skill`, slave);
				slave.skill[sk] = 0;
			}
		}

		if ((V.seeDicks > 0) && canPenetrate(slave) && App.Utils.hasNonassignmentSex(slave)) {
			V.averageDick += slave.dick, V.slavesWithWorkingDicks++;
		}

		if ((slave.lactation === 1)) {
			slave.lactationDuration--;
		}

		_ensureEmployeeMeetsJobRequirements(slave); // this can fire special slaves

		switch (slave.assignment) {
			case Job.HEADGIRLSUITE:
				if (slave.devotion >= random(-30, 20)) {
					V.HGSlaveSuccess++, V.HGEnergy++;
				} else {
					V.HGSlaveSuccess--;
				}
				break;
			case Job.CONCUBINE:
				V.Concubine = slave, V.fuckSlaves++;
				break;
			case Job.MASTERSUITE:
			case Job.FUCKTOY:
				V.fuckSlaves++;
				break;
		}

		if (slave.bellyPain !== 0) {
			slave.bellyPain = 0;
		}

		/* preg speed and advance*/

		if (slave.preg > 0) {
			let pregSpeed = 1; // base speed is normal
			if (slave.pregControl === "slow gestation") {
				pregSpeed = 0.5;
			} else if (slave.pregControl === "speed up") {
				pregSpeed = 2;
			}

			if (slave.broodmother === 1 && slave.broodmotherOnHold !== 1) { /* broodmother advance block */
				if ((V.week / slave.broodmotherFetuses === Math.round(V.week / slave.broodmotherFetuses)) && slave.broodmotherFetuses < 1) {
					// one fetus in few week - selection and adding
					WombImpregnate(slave, 1, slave.pregSource, 0);
				} else {
					// one or more fetuses in one week
					WombImpregnate(slave, Math.floor(slave.broodmotherFetuses), slave.pregSource, 0); /* really 0, it's will be advanced right few lines down.*/
				}
				if (slave.ovaryAge >= 47) {
					slave.broodmotherOnHold = 1;
					slave.broodmotherCountDown = 37 - WombMinPreg(slave);
				}
			}

			WombProgress(slave, pregSpeed, 1); /* drugs can affect speed of gestation, but not a real time */

			slave.pregKnown = 1;
			slave.pregWeek++;
		}
		if (slave.pregWeek < 0) { // postpartum state
			slave.pregWeek++;
		}

		SetBellySize(slave); /* here will be also set through WombGetVolume .bellyPreg, .pregType, to current values. */

		/* end of preg speed and advance*/

		/* set up sexual need */
		if (slave.devotion >= -50) {
			if (slave.energy > 20) {
				if (slave.physicalAge < slave.pubertyAgeXY && slave.genes === "XY" && slave.energy <= 80) {
					slave.need = slave.energy / 3;
				} else if (slave.physicalAge < slave.pubertyAgeXX && slave.genes === "XX" && slave.energy <= 80) {
					slave.need = slave.energy / 3;
				} else if (slave.physicalAge < 50) {
					slave.need = slave.energy;
				} else {
					slave.need = slave.energy / 5;
				}
				if (slave.balls > 0 && slave.pubertyXY === 1 && slave.physicalAge <= (slave.pubertyAgeXY + 1) && (slave.physicalAge > slave.pubertyAgeXY) && slave.physicalAge < 18) {
					slave.need = (slave.need * 1.25);
				}
				if ((slave.ovaries === 1 || slave.mpreg === 1) && slave.pubertyXX === 1 && slave.physicalAge <= (slave.pubertyAgeXX + 1) && (slave.physicalAge > slave.pubertyAgeXX) && slave.physicalAge < 18) {
					slave.need = (slave.need * 1.25);
				}
				if (slave.diet === "fertility") {
					slave.need += 10;
				}
				if (slave.aphrodisiacs === -1) {
					slave.need = (slave.need * 0.5);
				} else if (slave.aphrodisiacs === 1) {
					slave.need = (slave.need * 1.5);
				} else if (slave.aphrodisiacs === 2) {
					slave.need = (slave.need * 2);
				}
				poorHealthNeedReduction(slave);
				slave.need = Math.round(slave.need);
				slave.needCap = slave.need;
			}
		}

		if (slave.fetish === "mindbroken" && slave.relationship === -3) {
			if (slave.kindness > 0) {
				slave.kindness--;
			}
		}

		if (slave.assignment === Job.AGENT || slave.assignment === Job.AGENTPARTNER) {
			App.SlaveAssignment.agent(slave);
		}
	} // for (const slave of V.slaves)

	if (V.HeadGirl !== 0) {
		V.HGEnergy++;
		const slave = slaveStateById(V.HeadGirl.ID);
		if (V.personalAttention === PersonalAttention.SUPPORTHG) {
			V.HGEnergy++;
			if (slave.trust > 95) {
				V.HGEnergy++;
			}
		}
		if (arcology.FSChineseRevivalistLaw === 1) {
			V.HGEnergy++;
		}
		if (slave.health.tired > 90) {
			V.HGEnergy--;
		}
		if (canAchieveErection(slave)) {
			V.HGCum = 2 + Math.trunc((slave.balls / 5) + (slave.energy / 95) + (slave.health.condition / 95) + (slave.devotion / 95) + (V.reproductionFormula * 5));
		}
	}

	// Stud gets off based on impregnations, so we need to check and see if they actually do anyone
	if (V.StudID) {
		const stud = S.Stud;
		V.StudCum = 2 + Math.trunc(((stud.balls / 5) + (stud.energy / 95) + (stud.health.condition / 95) + (stud.devotion / 95) + (V.reproductionFormula * 5) - (stud.health.tired / 25)) * restEffects(stud, 5));
		if (stud.drugs === "hyper testicle enhancement") {
			V.StudCum += 3;
		} else if (stud.drugs === "testicle enhancement") {
			V.StudCum += 1;
		}
		if (stud.diet === "cum production") {
			V.StudCum += 1;
		}
		let studCumLimit = V.StudCum;
		for (const slave of V.slaves) {
			if (studCumLimit === 0 || stud.need <= 0) {
				break;
			}
			if (canGetPregnant(slave) && canBreed(stud, slave) && slave.ID !== V.StudID) {
				stud.need -= 20;
				if (stud.fetish === "pregnancy") {
					stud.need -= 30;
				}
			}
		}
	}

	if (V.averageDick > 0) {
		V.averageDick = V.averageDick / V.slavesWithWorkingDicks;
	}
	V.freeSexualEnergy = V.PC.sexualEnergy - V.fuckSlaves;
	const penthouseSlaves = App.Entity.facilities.penthouse.employees().length;
	if (V.freeSexualEnergy > 0) {
		if (V.freeSexualEnergy > penthouseSlaves / 2) {
			V.freeSexualEnergy = 3;
		} else if (V.freeSexualEnergy > penthouseSlaves / 4) {
			V.freeSexualEnergy = 2;
		} else {
			V.freeSexualEnergy = 1;
		}
	}

	if (S.HeadGirl) {
		const HGPossibleSlaves = [[], [], [], [], [], []];
		for (const slave of V.slaves) {
			if (!assignmentVisible(slave) || slave.fuckdoll === 1 || slave.ID === V.Bodyguard.ID || slave.ID === V.HeadGirl.ID || 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, V.HGEnergy);
	} else {
		V.HGTrainSlavesIDs = [];
	}

	/**
	* Accordion
	* @version 0.7RC
	* @author 000-250-006
	*
	* @param array _facListArr V.args
	*	Multidimensional temporary array
	*	0: The passage name for the facility's report
	*	1: The facility name capitalized (@see todo)
	*	2: max number of slaves allowed in facility - > 0 implies open
	*	3: number of slaves assigned to facility
	*	4: ID of the slave assigned to run the facility ("Boss")
	*	5: Text title of the Boss
	*
	* @todo This is a proof of concept construct, if it works and cuts overhead, intended to create an object
	*	for deeper use in multiple locations, including streamlining reports/facilities code to one widget
	* @todo Figure out if this would be better as an object rather than an array for overhead
	*	StoryInit also?
	* @todo Figure out why we're not using ndef/-1 for a bunch of these story variables. Leaky conditionals
	* @todo Figure out why we're using variable space with capitalized facility names when we can parse it from true name
	*/

	const facListArr = [
		["Arcade Report", App.Entity.facilities.arcade],
		["Brothel Report", App.Entity.facilities.brothel],
		["Cellblock Report", App.Entity.facilities.cellblock],
		["Clinic Report", App.Entity.facilities.clinic],
		["Club Report", App.Entity.facilities.club],
		["Dairy Report", App.Entity.facilities.dairy],
		["Farmyard Report", App.Entity.facilities.farmyard],
		["Schoolroom Report", App.Entity.facilities.schoolroom],
		["Spa Report", App.Entity.facilities.spa],
		["Nursery Report", App.Entity.facilities.nursery],
		["Servants' Quarters Report", App.Entity.facilities.servantsQuarters],
		["Children Report", "Nursery Children", V.nursery, V.nurseryBabies],
		["Incubator Report", App.Entity.facilities.incubator],
		["Master Suite Report", App.Entity.facilities.masterSuite],
		["Penthouse Report", "The Penthouse"],
		["Rules Assistant Report", "Rules Assistant", V.rulesAssistantAuto], /** should be last — may reassign slaves **/
		["Lab Report", "Lab", V.researchLab.level]
	];

	function _getReportElementStats(ar) {
		if (typeof ar[1] == "string") {
			if (ar[1] === "The Penthouse") { // special case because we have to combine several facilities
				return {
					name: ar[1],
					established: 1,
					entriesNumberInitial: initialPenthouseTotalEmployeesCount,
					entriesNumber: _countPenthousePopulation(),
					manager: null
				};
			} else {
				return {
					name: ar[1],
					established: ar[2],
					entriesNumberInitial: null,
					entriesNumber: ar[3],
					manager: null
				};
			}
		} else {
			return {
				name: ar[1].nameCaps,
				established: ar[1].established,
				entriesNumberInitial: initialEmployeesCount[ar[1].desc.baseName],
				entriesNumber: ar[1].hostedSlaves,
				manager: ar[1].manager
			};
		}
	}

	const buttonClasses = V.useAccordion > 0 ? ["buttonBar", "accordion"] : ["buttonBar"]; // Is Accordion turned on?
	const disTxt = V.useAccordion > 0 ? "" : " disabled='disabled'"; // Chunk the row from our array we're working on to make reading code easier, null some text vars we'll need
	for (const facSubArr of facListArr) {
		const reportContent = document.createElement("div");
		App.UI.DOM.includePassage(reportContent, facSubArr[0]);
		if (V.useAccordion === 1) {
			reportContent.className = "accHidden";
		}

		const stats = _getReportElementStats(facSubArr); // needs to be inside the loop after the report passage to get the employees number after re-assignments

		const str = facSubArr[0].replace(/\W+/g, '-').toLowerCase(); // Normalize the passage name to use as an element ID
		if (stats.established) { /** Do we have one of these facilities? */
			if (stats.entriesNumber === 0 && !stats.manager) { // Is there anyone inside the facility?
				// No — it's empty, so we display the heading without a button and with a thinner bar under it
				App.UI.DOM.appendNewElement("strong", res, `${stats.name} Report`);
				App.UI.DOM.appendNewElement("hr", res).style.margin = "0";
				App.UI.DOM.appendNewElement("span", res, `${stats.name} is currently empty`, "gray");
				App.UI.DOM.appendNewElement("br", res);
				App.UI.DOM.appendNewElement("br", res);
				/** Old code: <<= '
' + _facSubArr[1] + ' is currently unstaffed
'>> */
			} else {
				const btn = App.UI.DOM.appendNewElement("button", res, `${stats.name}  Report`, buttonClasses);
				btn.type = "button" + disTxt;
				btn.id = `button-${str}`;
				if (_.isNil(stats.entriesNumber)) {
					// Yes, display the bar with information
					btn.setAttribute("data-after", '');
				} else {
					// Yes, display the bar with information
					const diffNum = stats.entriesNumber - stats.entriesNumberInitial;
					let diffText = diffNum === 0 ? "" : (diffNum > 0 ? ` (+${diffNum})` : ` (${diffNum})`);
					btn.setAttribute("data-after", `${stats.entriesNumber}${diffText} slave${stats.entriesNumber !== 1 ? 's' : ''} in ${stats.name}`);
				}
			}
			res.appendChild(reportContent);
		}
	}

	return res;

	function _countPenthousePopulation() {
		const fs = App.Entity.facilities;
		return fs.penthouse.employeesIDs().size + fs.headGirlSuite.totalEmployeesCount + fs.armory.totalEmployeesCount;
	}

	function _printSlaveError(warning, slave) {
		const warningLine = App.UI.DOM.appendNewElement("div", res);
		App.UI.DOM.appendNewElement("span", warningLine, warning + `for ${slave.slaveName}.`, "yellow");
		warningLine.appendChild(document.createTextNode(" Report this as a bug if it reoccurs."));
	}

	/**
	 * Check key employees. Fire those who do not satisfy their job requirements
	 * @param {App.Entity.SlaveState} slave
	 */
	function _ensureEmployeeMeetsJobRequirements(slave) {
		switch (slave.assignment) {
			case Job.HEADGIRL:
				V.HeadGirl = slave;
				if (V.HeadGirl.fetish === "mindbroken") {
					_printSlaveUnassignedNote(slave, "is mindbroken");
					V.HeadGirl = 0;
				} else if (!canTalk(V.HeadGirl)) {
					_printSlaveUnassignedNote(slave, "can't give slaves verbal orders");
					V.HeadGirl = 0;
				} else if (!canWalk(V.HeadGirl)) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
					V.HeadGirl = 0;
				} else if (!canHold(V.HeadGirl)) {
					_printSlaveUnassignedNote(slave, "is no longer able to handle your slaves");
					V.HeadGirl = 0;
				} else if (!canSee(V.HeadGirl)) {
					_printSlaveUnassignedNote(slave, "can no longer see");
					V.HeadGirl = 0;
				} else if (!canHear(V.HeadGirl)) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
					V.HeadGirl = 0;
				} else if (V.HeadGirl.preg > 37 && V.HeadGirl.broodmother === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your Head Girl any longer`);
					V.HeadGirl = 0;
				} else if (V.HeadGirl.devotion <= 20) {
					_printSlaveUnassignedNote(slave, "is no longer even accepting of you");
					V.HeadGirl = 0;
				}
				if (V.HeadGirl === 0) {
					removeJob(slave, Job.HEADGIRL);
				}
				break;
			case Job.RECRUITER:
				V.Recruiter = slave;
				if (slave.fetish === "mindbroken") {
					_printSlaveUnassignedNote(slave, "is mindbroken");
					V.Recruiter = 0;
				} else if (!canTalk(slave)) {
					_printSlaveUnassignedNote(slave, "can't verbally entice marks");
					V.Recruiter = 0;
				} else if (slave.preg > 37 && slave.broodmother === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your recruiter any longer`);
					V.Recruiter = 0;
				} else if (!canWalk(slave)) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
					V.Recruiter = 0;
				} else if (!canSee(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer see");
					V.Recruiter = 0;
				} else if (!canHear(V.Recruiter)) {
					_printSlaveUnassignedNote(slave, "an no longer hear");
					V.Recruiter = 0;
				}
				if (V.Recruiter === 0) {
					removeJob(slave, Job.RECRUITER);
				}
				break;
			case Job.MADAM:
				if (V.unMadam === 1) {
					_printSlaveUnassignedNote(slave, "can't give whores verbal orders");
				} else if (V.unMadam === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your Madam any longer`);
				} else if (V.unMadam === 3) {
					_printSlaveUnassignedNote(slave, "is mindbroken");
				} else if (V.unMadam === 4) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
				} else if (V.unMadam === 5) {
					_printSlaveUnassignedNote(slave, "can no longer see");
				} else if (V.unMadam === 6) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
				} else if (V.unMadam === 7) {
					_printSlaveUnassignedNote(slave, `can no longer handle ${getPronouns(slave).his} underlings`);
				}
				if (V.Madam === 0) {
					removeJob(slave, Job.MADAM);
				}
				break;
			case Job.DJ:
				if (V.unDJ === 1) {
					_printSlaveUnassignedNote(slave, "can't speak");
				} else if (V.unDJ === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your DJ any longer`);
				} else if (V.unDJ === 3) {
					_printSlaveUnassignedNote(slave, "is mindbroken");
				} else if (V.unDJ === 4) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
				} else if (V.unDJ === 5) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
				}
				if (V.DJ === 0) {
					removeJob(slave, Job.DJ);
				}
				break;
			case Job.MILKMAID:
				V.Milkmaid = slave;
				if (V.Milkmaid.fetish === "mindbroken") {
					_printSlaveUnassignedNote(slave, "is mindbroken");
					V.Milkmaid = 0;
				} else if (V.Milkmaid.preg > 37 && V.Milkmaid.broodmother === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your Milkmaid any longer`);
					V.Milkmaid = 0;
				} else if (!canWalk(V.Milkmaid)) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
					V.Milkmaid = 0;
				} else if (!canHold(V.Milkmaid)) {
					_printSlaveUnassignedNote(slave, "can no longer handle nor milk your slaves");
					V.Milkmaid = 0;
				} else if (!canSee(V.Milkmaid)) {
					_printSlaveUnassignedNote(slave, "can no longer see");
					V.Milkmaid = 0;
				} else if (!canHear(V.Milkmaid)) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
					V.Milkmaid = 0;
				}
				if (V.Milkmaid === 0) {
					removeJob(slave, Job.MILKMAID);
				}
				break;
			case Job.FARMER:
				V.Farmer = slave;
				if (V.Farmer.fetish === "mindbroken") {
					_printSlaveUnassignedNote(slave, "is mindbroken");
					V.Farmer = 0;
				} else if (V.Farmer.preg > 37 && V.Farmer.broodmother === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your Farmer any longer`);
					V.Farmer = 0;
				} else if (!canWalk(V.Farmer)) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
					V.Farmer = 0;
				} else if (!canHold(V.Farmer)) {
					_printSlaveUnassignedNote(slave, "can no longer grip things");
					V.Farmer = 0;
				} else if (!canSee(V.Farmer)) {
					_printSlaveUnassignedNote(slave, "can no longer see");
					V.Farmer = 0;
				} else if (!canHear(V.Farmer)) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
					V.Farmer = 0;
				}
				if (V.Farmer === 0) {
					removeJob(slave, Job.FARMER);
				}
				break;
			case Job.STEWARD:
				if (!canTalk(slave)) {
					_printSlaveUnassignedNote(slave, "can't give servants verbal orders");
					V.StewardessID = 0;
				} else if (slave.preg > 37 && slave.broodmother === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your Stewardess any longer`);
					V.StewardessID = 0;
				} else if (slave.fetish === "mindbroken") {
					_printSlaveUnassignedNote(slave, "is mindbroken");
					V.StewardessID = 0;
				} else if (!canWalk(slave)) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
					V.StewardessID = 0;
				} else if (!canHold(slave)) {
					_printSlaveUnassignedNote(slave, `can no longer handle ${getPronouns(slave).his} underlings nor effectively clean`);
					V.StewardessID = 0;
				} else if (!canSee(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer see");
					V.StewardessID = 0;
				} else if (!canHear(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
					V.StewardessID = 0;
				}
				if (V.StewardessID === 0) {
					removeJob(slave, Job.STEWARD);
				}
				break;
			case Job.TEACHER:
				V.Schoolteacher = slave;
				if (!canTalk(slave)) {
					_printSlaveUnassignedNote(slave, "can't give verbal instruction");
					V.Schoolteacher = 0;
				} else if (slave.preg > 37 && slave.broodmother === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your Schoolteacher any longer`);
					V.Schoolteacher = 0;
				} else if (slave.fetish === "mindbroken") {
					_printSlaveUnassignedNote(slave, "is mindbroken");
					V.Schoolteacher = 0;
				} else if (!canSee(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer see");
					V.Schoolteacher = 0;
				} else if (!canHear(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
					V.Schoolteacher = 0;
				}
				if (V.Schoolteacher === 0) {
					removeJob(slave, Job.TEACHER);
				}
				break;
			case Job.WARDEN:
				V.Wardeness = slave;
				if (!canWalk(slave)) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
					V.Wardeness = 0;
				} else if (!canHold(slave)) {
					_printSlaveUnassignedNote(slave, `can no longer handle ${getPronouns(slave).his} charges`);
					V.Wardeness = 0;
				} else if (slave.preg > 37 && slave.broodmother === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your Wardeness any longer`);
					V.Wardeness = 0;
				} else if (!canSee(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer see");
					V.Wardeness = 0;
				} else if (!canHear(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
					V.Wardeness = 0;
				}
				if (V.Wardeness === 0) {
					removeJob(slave, Job.WARDEN);
				}
				break;
			case Job.ATTENDANT:
				if (slave.fetish === "mindbroken") {
					_printSlaveUnassignedNote(slave, "is mindbroken");
					V.AttendantID = 0;
				} else if (slave.preg > 37 && slave.broodmother === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your Attendant any longer`);
					V.AttendantID = 0;
				} else if (!canWalk(slave)) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
					V.AttendantID = 0;
				} else if (!canHold(slave)) {
					_printSlaveUnassignedNote(slave, `can no longer support ${getPronouns(slave).his} charges`);
					V.AttendantID = 0;
				} else if (!canHear(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
					V.AttendantID = 0;
				}
				if (V.AttendantID === 0) {
					removeJob(slave, Job.ATTENDANT);
				}
				break;
			case Job.MATRON:
				V.Matron = slave;
				if (slave.fetish === "mindbroken") {
					_printSlaveUnassignedNote(slave, "is mindbroken");
					V.Matron = 0;
				} else if (slave.preg > 37 && slave.broodmother === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your Matron any longer`);
					V.Matron = 0;
				} else if (!canWalk(slave)) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
					V.Matron = 0;
				} else if (!canHold(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer hold infants");
					V.Matron = 0;
				} else if (!canHear(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
					V.Matron = 0;
				} else if (!canSee(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer see");
					V.Matron = 0;
				}
				if (V.Matron === 0) {
					removeJob(slave, Job.MATRON);
				}
				break;
			case Job.NURSE:
				V.Nurse = slave;
				if (slave.fetish === "mindbroken") {
					_printSlaveUnassignedNote(slave, "is mindbroken");
					V.Nurse = 0;
				} else if (slave.preg > 37 && slave.broodmother === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your Nurse any longer`);
					V.Nurse = 0;
				} else if (!canWalk(slave)) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
					V.Nurse = 0;
				} else if (!canHold(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer hold onto patients");
					V.Nurse = 0;
				} else if (!canSee(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer see");
					V.Nurse = 0;
				} else if (!canHear(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
					V.Nurse = 0;
				}
				if (V.Nurse === 0) {
					removeJob(slave, Job.NURSE);
				}
				break;
			case Job.BODYGUARD:
				V.Bodyguard = slave;
				if (slave.fetish === "mindbroken") {
					_printSlaveUnassignedNote(slave, "is mindbroken");
					V.Bodyguard = 0;
				} else if (!canWalk(slave)) {
					_printSlaveUnassignedNote(slave, "is no longer independently mobile");
					V.Bodyguard = 0;
				} else if (!canHold(slave)) {
					_printSlaveUnassignedNote(slave, "is no longer able to hold a weapon");
					V.Bodyguard = 0;
				} else if (slave.preg > 37 && slave.broodmother === 2) {
					_printSlaveUnassignedNote(slave, "spends so much time giving birth and laboring that", `${getPronouns(slave).he} cannot effectively serve as your bodyguard any longer`);
					V.Bodyguard = 0;
				} else if (!canSee(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer see");
					V.Bodyguard = 0;
				} else if (!canHear(slave)) {
					_printSlaveUnassignedNote(slave, "can no longer hear");
					V.Bodyguard = 0;
				}
				if (V.Bodyguard === 0) {
					removeJob(slave, Job.BODYGUARD);
				}
				break;
			case Job.SUBORDINATE:
				if (slave.subTarget === -1) {
					V.StudID = slave.ID;
					if (slave.balls === 0) {
						_printSlaveUnassignedNote(slave, "no longer has sperm", null, "@Stud");
						V.StudID = 0;
					} else if (slave.ballType === "sterile") {
						_printSlaveUnassignedNote(slave, "no longer produces potent sperm", null, "@Stud");
						V.StudID = 0;
					} else if (slave.pubertyXY !== 1) {
						_printSlaveUnassignedNote(slave, "no longer produces mature sperm", null, "@Stud");
						V.StudID = 0;
					} else if (slave.vasectomy === 1) {
						_printSlaveUnassignedNote(slave, "shoots blanks due to a vasectomy", null, "@Stud");
						V.StudID = 0;
					} else if (V.universalRulesImpregnation !== "Stud") {
						_printSlaveUnassignedNote(slave, "is", "no longer needed as a Stud", "@Stud");
					}
					if (V.StudID === 0) {
						slave.subTarget = 0;
					}
				}
		}

		if (slave.ID === V.LurcherID) {
			if (!canWalk(slave)) {
				_printSlaveUnassignedNote(slave, "is no longer able to run", null, Job.LURCHER);
				V.LurcherID = 0;
			} else if (!canHold(slave)) {
				_printSlaveUnassignedNote(slave, "is no longer able to catch the hares", null, Job.LURCHER);
				V.LurcherID = 0;
			} else if (!canHear(slave) && !canSee(slave)) {
				_printSlaveUnassignedNote(slave, "is no longer able to track the hares", null, Job.LURCHER);
				V.LurcherID = 0;
			} else if (slave.bellyPreg >= 60000) {
				_printSlaveUnassignedNote(slave, "is too pregnant to run", null, Job.LURCHER);
				V.LurcherID = 0;
			}
		}

		if (V.fighterIDs.includes(slave)) {
			if (!canWalk(slave)) {
				_printSlaveUnassignedNote(slave, "is no longer independently mobile",
					`and cannot fight any more. ${getPronouns(slave).he} has been removed from ${App.Entity.facilities.pit.name} roster`);
				V.fighterIDs.delete(slave.ID);
			} else if (!canHold(slave)) {
				_printSlaveUnassignedNote(slave, "is no longer able to strike",
					`and cannot fight any more. ${getPronouns(slave).he} has been removed from ${App.Entity.facilities.pit.name} roster`);
				V.fighterIDs.delete(slave.ID);
			}
		}
	}

	/**
	 *
	 * @param {App.Entity.SlaveState} slave
	 * @param {string} condition
	 * @param {string} [outcome]
	 * @param {string} [assignment]
	 */
	function _printSlaveUnassignedNote(slave, condition, outcome, assignment) {
		const cantServeNotes = new Map([
			[Job.HEADGIRL, "cannot serve as your Head Girl any more"],
			[Job.RECRUITER, "and cannot serve as your recruiter any more"],
			[Job.MADAM, "cannot serve as your Madam any more"],
			[Job.DJ, "cannot serve as your DJ any more"],
			[Job.MILKMAID, "cannot serve as your Milkmaid any more"],
			[Job.FARMER, "cannot serve as your Farmer any more"],
			[Job.STEWARD, "cannot serve as your Stewardess any more"],
			[Job.TEACHER, "cannot serve as your Schoolteacher any more"],
			[Job.WARDEN, "cannot serve as your Wardeness any more"],
			[Job.ATTENDANT, "cannot serve as your Attendant any more"],
			[Job.BODYGUARD, " cannot serve as your Bodyguard any more"],
			["@Stud", "cannot serve as a Stud any more"],
			[Job.NURSE, "cannot serve as your Nurse any more"],
			[Job.MATRON, "cannot serve as your Matron any more"],
			[Job.LURCHER, "cannot course as a lurcher"]
		]);

		const warningLine = App.UI.DOM.appendNewElement("div", res);
		App.UI.DOM.appendNewElement("span", warningLine, slave.slaveName, 'slave-name');
		warningLine.appendChild(document.createTextNode(' ' + condition + ' '));
		App.UI.DOM.appendNewElement("span", warningLine, outcome ? outcome : `and ${cantServeNotes[assignment || slave.assignment]}`, "yellow");
		warningLine.appendChild(document.createTextNode("."));
	}
};


code:
/** base class for class-based events */
App.Events.BaseEvent = class BaseEvent {
	/** build a new event
	 *  parameters are necessary for serialization (so that saving with the event active will work correctly) and should not normally be used directly
	 *  child classes will inherit this implementation automatically, and should not normally need their own constructor implementation
	 * @param {Array<number>} [actors]
	 * @param {object} [params]
	 */
	constructor(actors, params) {
		/** @member {Array<number>} actors - a list of IDs for the actors participating in this event. */
		this.actors = actors || [];
		/** @member {object} params - a set of parameters to pass to the event. */
		this.params = params || {};
	}

	/** Event predicates determine whether the event will occur or not.
	 * @callback eventPredicate
	 * @returns {boolean}
	 */
	/** generate an array of zero or more predicates which must all return true in order for the event to be valid.
	 *  lambda predicates may add properties to {@link App.Events.BaseEvent#params the params member} in order to pass information on to the event.
	 *  child classes should implement this.
	 * @returns {Array<eventPredicate>}
	 */
	eventPrerequisites() {
		return [];
	}

	/** Actor predicates determine whether an actor is qualified for an event or not.
	 * @callback actorPredicate
	 * @param {App.Entity.SlaveState} slave
	 * @returns {boolean}
	 */
	/** generate an array of zero or more arrays, each corresponding to an actor in the event, which contain zero or more predicates which must be satisfied by the actor.
	 *  child classes should implement this.
	 * @returns {Array<Array<actorPredicate>>}
	 */
	actorPrerequisites() {
		return [];
	}

	/** get the choice weight for the event. Weights should be integral; higher weight means higher probability of selection.
	 * @returns {number}
	 */
	get weight() {
		return 1;
	}

	/** run the event and attach DOM output to the event passage.
	 *  child classes must implement this.
	 * @param {DocumentFragment} node - Document fragment which event output should be attached to
	 */
	execute(node) {
	}

	/** clone the event (needed for serialization).
	 *  default implementation should suffice for child classes */
	clone() {
		let c = {};
		Reflect.setPrototypeOf(c, Reflect.getPrototypeOf(this));
		deepAssign(c, this);
		return c;
	}

	/** serialize the event instance so it persists through saves.
	 *  default implementation should suffice for child classes assigned to App.Events */
	toJSON() {
		return JSON.reviveWrapper(`new App.Events.${this.constructor.name}(${JSON.stringify(this.actors)},${JSON.stringify(this.params)})`);
	}

	/** get the event's (human-readable) name. must not include ":".
	 *  default implementation should generally suffice (though we might want to de-camelcase here or something).
	 * @returns {string}
	 */
	get eventName() {
		return this.constructor.name;
	}

	/** build the actual list of actors that will be involved in this event.
	 *  default implementation should suffice for child classes with a fixed number of actors; may be overridden for events with variable actor count.
	 * @param {App.Entity.SlaveState} firstActor - if non-null, the first actor should be this slave (fail if she is not qualified)
	 * @returns {boolean} - return false if sufficient qualified actors could not be found (cancel the event)
	 */
	castActors(firstActor) {
		const prereqs = this.actorPrerequisites();

		let i = 0;
		if (firstActor && prereqs.length > 0) {
			if (prereqs[0].every(p => p(firstActor))) {
				this.actors.push(firstActor.ID);
			} else {
				return false; // preselected first actor was not qualified
			}
			i = 1; // first actor is cast
		}

		for (; i < prereqs.length; ++i) {
			const qualified = V.slaves.filter(s => !this.actors.includes(s.ID) && prereqs[i].every(p => p(s)));
			if (qualified.length === 0) {
				return false; // a required actor was not found
			}
			this.actors.push(qualified.pluck().ID);
		}

		return true; // all actors cast
	}
};

/** This is a trivial event for use as an example. */
App.Events.TestEvent = class TestEvent extends App.Events.BaseEvent {
	constructor(actors, params) {
		super(actors, params);
	}

	eventPrerequisites() {
		return [];
	}

	actorPrerequisites() {
		return [
			[] // one actor, no requirements
		];
	}

	execute(node) {
		let [eventSlave] = this.actors.map(a => getSlave(a)); // mapped deconstruction of actors into local slave variables
		App.Events.drawEventArt(node, eventSlave);
		node.appendChild(document.createTextNode(`This test event for ${eventSlave.slaveName} was successful.`));
	}
};

repo_name: KnightBoulegard/fc

license: mit


code:
App.Events.RESSAssFitting = class RESSAssFitting extends App.Events.BaseEvent {
	eventPrerequisites() {
		return []; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.assignment !== "work as a servant",
				s => s.devotion > 20,
				s => s.butt > 5,
				s => ["a bimbo outfit", "a biyelgee costume", "a bunny outfit", "a burkini", "a cheerleader outfit", "a comfortable bodysuit", "a dirndl", "a fallen nuns habit", "a huipil", "a latex catsuit", "a leotard", "a long qipao", "a maternity dress", "a military uniform", "a monokini", "a mounty outfit", "a nice nurse outfit", "a red army uniform", "a scalemail bikini", "a schoolgirl outfit", "a schutzstaffel uniform", "a slutty nurse outfit", "a slutty outfit", "a slutty qipao", "a slutty schutzstaffel uniform", "a succubus outfit", "attractive lingerie for a pregnant woman", "attractive lingerie", "battlearmor", "chains", "clubslut netting", "conservative clothing", "cutoffs and a t-shirt", "kitty lingerie", "lederhosen", "nice business attire", "overalls", "restrictive latex", "striped panties", "slutty business attire", "slutty jewelry", "spats and a tank top", "stretch pants and a crop-top", "uncomfortable straps", "Western clothing"].includes(s.clothes),
				hasAnyArms,
				hasAnyLegs,
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, hers, him, himself, girl
		} = getPronouns(eventSlave);
		const {s, S, ss, title: Master} = getEnunciation(eventSlave);

		/** @type {App.Entity.PlayerState} */
		let PC = V.PC;

		V.nextLink = "Next Week";

		let artDiv = document.createElement("div"); // named container so we can replace it later
		App.Events.drawEventArt(artDiv, eventSlave, "no clothing");
		node.appendChild(artDiv);

		let t = [];
		t.push(`Your slaves get dressed in a large wardrobe area adjacent to the dormitory, rooms, and showers. There are always slaves working, so groups of slaves can be seen putting on their clothing here several times a day. Your naked sex slaves hurrying into the outfits you've selected for them is an undeniably erotic sight. Sometimes it's comical, especially when your transformations of your slaves' bodies produce amusing inconveniences. Today, it's`);
		t.push(App.UI.slaveDescriptionDialog(eventSlave));
		t.push(`who is having trouble. ${His}`);
		if (eventSlave.buttImplant / eventSlave.butt >= 0.5) {
			t.push(`fake`);
		} else if (eventSlave.butt > 12) {
			t.push(`ridiculously massive`);
		} else if (eventSlave.butt > 8) {
			t.push(`gigantic`);
		} else {
			t.push(`plush`);
		}
		t.push(`ass is`);
		if (eventSlave.drugs === "butt injections" || eventSlave.drugs === "intensive butt injections") {
			t.push(`growing explosively due to the expansion injections.`);
		} else if (eventSlave.drugs === "hyper butt injections") {
			t.push(`growing explosively due to the hyper expansion injections.`);
		} else if (eventSlave.diet === "fattening") {
			t.push(`apparently bigger today than it was yesterday, which isn't surprising, considering how much ${he}'s being fed.`);
		} else if (eventSlave.preg > eventSlave.pregData.normalBirth / 5 && eventSlave.pregKnown === 1) {
			t.push(`apparently bigger today than it was yesterday. Pregnancy often causes minor redistributions of weight like this.`);
		} else if (V.geneticMappingUpgrade >= 1 && eventSlave.geneticQuirks.rearLipedema === 2) {
			t.push(`apparently a little bigger today than it was yesterday. ${His} body is constantly laying fat on ${his} ass and thighs, so this isn't really unexpected.`);
		} else if (eventSlave.buttImplantType === "string") {
			t.push(`apparently a little bigger today than it was yesterday. String implants like ${he}rs steadily grow if not regularly drained.`);
		} else if (eventSlave.diet === "corrective" && eventSlave.weight < -10) {
			t.push(`apparently a little bigger today than it was yesterday. ${He} is underweight and being slowly plumped up, so this is a sign of progress.`);
		} else if (eventSlave.hormoneBalance >= 200) {
			t.push(`apparently bigger today than it was yesterday. Intensive female hormone regimens like ${he}rs sometimes cause minor ass expansion.`);
		} else if (eventSlave.buttImplant / eventSlave.butt >= 0.5) {
			t.push(`apparently a little bigger today than it was yesterday. Large implants like ${he}rs normally cause some slight size fluctuations.`);
		} else {
			t.push(`apparently a little bigger today than it was yesterday. With a behind as big as ${he}rs, a little natural fluctuation is inevitable.`);
		}
		App.Events.addParagraph(node, t);
		t = [];
		t.push(`${He} can't manage to`);
		switch (eventSlave.clothes) {
			case "conservative clothing":
				t.push(`pull ${his} nicely tailored slacks up over ${his} buttocks, not without risking the seams. ${He}'s got them`);
				break;
			case "a nice nurse outfit":
				t.push(`pull ${his} hospital uniform pants up over ${his} buttocks, not without risking the seams. ${He}'s got them`);
				break;
			case "chains":
				t.push(`fit the loop of chain that goes around ${his} waist over ${his} buttocks. ${He}'s got it`);
				break;
			case "Western clothing":
				t.push(`get the upper part of ${his} chaps pulled up and over ${his} buttocks. ${He}'s got them`);
				break;
			case "a huipil":
				t.push(`the huipil is very low and tight cut to hide only the front of the breasts and ${his} buttocks. ${He}'s got it`);
				break;
			case "a slutty qipao":
				t.push(`the middle part of ${his} step in qipao, the part which doesn't open from the top or the bottom, pulled up and over ${his} buttocks. ${He}'s got it`);
				break;
			case "uncomfortable straps":
				t.push(`fit some of ${his} straps around ${his} buttocks. ${He}'s got them`);
				break;
			case "restrictive latex":
				t.push(`shimmy ${his} latex outfit up and over ${his} buttocks. ${He}'s got it`);
				break;
			case "attractive lingerie":
				t.push(`pull ${his} pretty lace g-string up over ${his} buttocks, not without tearing it. ${He}'s got it`);
				break;
			case "a succubus outfit":
				t.push(`get ${his} leather skirt pulled up and over ${his} buttocks. ${He}'s got it`);
				break;
			case "a cheerleader outfit":
				t.push(`get ${his} cheerleader skirt pulled up and over ${his} buttocks. ${He}'s got it`);
				break;
			case "clubslut netting":
				t.push(`shimmy ${his} clubslut netting up and over ${his} buttocks, not without totally stretching it out and ruining it. ${He}'s got it`);
				break;
			case "cutoffs and a t-shirt":
				t.push(`get ${his} jean cutoffs pulled up and over ${his} buttocks. ${He}'s got them`);
				break;
			case "a slutty outfit":
				t.push(`get ${his} slutty skirt pulled up and over ${his} buttocks. ${He}'s got it`);
				break;
			case "a slutty nurse outfit":
				t.push(`get ${his} tight slutty nurse skirt pulled up and over ${his} buttocks. ${He}'s got it`);
				break;
			case "a schoolgirl outfit":
				t.push(`get ${his} schoolgirl skirt pulled up and over ${his} buttocks. ${He}'s got it`);
				break;
			case "a fallen nuns habit":
				t.push(`shimmy the skirt of ${his} slutty latex habit up and over ${his} buttocks. ${He}'s got it`);
				break;
			case "nice business attire":
				t.push(`get ${his} nicely tailored suit skirt up over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "slutty business attire":
				t.push(`get ${his} slutty little suit skirt up over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "a comfortable bodysuit":
				t.push(`shimmy ${his} bodysuit up and over ${his} buttocks. ${He}'s got it`);
				break;
			case "a latex catsuit":
				t.push(`shimmy ${his} latex catsuit up and over ${his} buttocks. ${He}'s got it`);
				break;
			case "a military uniform":
				t.push(`get ${his} perfectly pressed uniform skirt up over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "a schutzstaffel uniform":
				t.push(`get ${his} perfectly pressed uniform trousers up over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "a slutty schutzstaffel uniform":
				t.push(`get ${his} perfectly pressed uniform miniskirt up over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "a long qipao":
				t.push(`get ${his} long dress down over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "overalls":
				t.push(`fit ${his} rear into the unyielding denim of ${his} tight overalls. ${He}'s got them`);
				break;
			case "battlearmor":
				t.push(`get ${his} armor up over ${his} buttocks. ${He}'s got it`);
				break;
			case "a mounty outfit":
				t.push(`get ${his} slacks over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "a dirndl":
				t.push(`get ${his} skirt up over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "lederhosen":
				t.push(`get ${his} shorts up over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "a biyelgee costume":
				t.push(`get ${his} skirt up over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "a red army uniform":
				t.push(`get ${his} perfectly pressed uniform skirt up over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "a leotard":
				t.push(`pull ${his} leotard up and over ${his} buttocks, not without stretching it out and ruining it. ${He}'s got it`);
				break;
			case "a bunny outfit":
				t.push(`get ${his} tailored teddy up over ${his} buttocks, not without risking the seams. ${He}'s got it`);
				break;
			case "slutty jewelry":
				t.push(`get a couple of the light golden chains of ${his} bangles up and over ${his} buttocks. ${He}'s got them`);
				break;
			case "attractive lingerie for a pregnant woman":
			case "kitty lingerie":
				t.push(`pull ${his} pretty silk panties up over ${his} buttocks, not without tearing it. ${He}'s got it`);
				break;
			case "a maternity dress":
				t.push(`pull ${his} maternity dress up over ${his} buttocks; it was made to stretch, but not in this direction. ${He}'s got it`);
				break;
			case "spats and a tank top":
				t.push(`get ${his} spats up over ${his} buttocks, not without tearing the fabric. ${He}'s got them`);
				break;
			case "striped panties":
				t.push(`get ${his} panties up over ${his} buttocks, not without tearing the fabric. ${He}'s got them`);
				break;
			case "stretch pants and a crop-top":
				t.push(`pull ${his} stretch pants up over ${his} buttocks; they may have been made to stretch, but are completely overwhelmed by ${his} ass. ${He}'s got it`);
				break;
			case "a scalemail bikini":
				t.push(`pull ${his} scalemail bikini bottom up over ${his} buttocks, not without risking a nasty cut from the material. ${He}'s got it`);
				break;
			case "a monokini":
				t.push(`pull ${his} monokini up over ${his} buttocks, let alone to where ${he} needs it to be to put on the shoulder straps. ${He}'s got it`);
				break;
			case "a burkini":
				t.push(`pull ${his} burkini up over ${his} buttocks, making the modest swimsuit seem anything but. ${He}'s got it`);
				break;
			case "a bimbo outfit":
				t.push(`pull ${his} outfit's miniskirt up over ${his} buttocks, at least not while having to stop and dig ${his} thong out of ${his} crack after every try. ${He}'s got it`);
				break;
			default:
				t.push(`get ${his} outfit pulled up over ${his} buttocks. ${He}'s got it`);
				break;
		}
		t.push(`up to the tops of ${his} thighs, but that's all ${he} can manage. The wardrobe includes many sizes of all the outfits, and ${he}'ll have to switch out for a bigger one. Sighing, ${he} turns back towards the racks and starts trying to struggle free. As ${he} does, ${he} notices you, and realizes you can see ${his} contortions and the resulting ass jiggling.`);
		if (canTalk(eventSlave)) {
			t.push(`"Hi ${Master}," ${he} greets you`);
		} else {
			t.push(`${He} frees up a hand and uses gestures to greet you`);
		}
		if ((eventSlave.fetishKnown === 1) && (eventSlave.fetish === "buttslut")) {
			t.push(`flirtatiously. Deciding to be even more blatant, the shameless buttslut turns back around and keeps struggling, obviously making no attempt to actually solve ${his} situation and even managing to accidentally on purpose pull ${his} huge buttocks apart, giving you a clear view of ${his} ready asshole.`);
		} else if (eventSlave.energy > 80) {
			t.push(`flirtatiously. ${He}'s a needy slut and wants it constantly, so ${he} turns back around and keeps struggling, obviously making no attempt to actually solve ${his} situation.`);
		} else if (eventSlave.trust > 20) {
			t.push(`trustingly. ${He}'s thoroughly accustomed to the idea of your eyes on ${his} big bare butt, so ${he} goes back to ${his} efforts, which bounce ${his} behind deliciously.`);
		} else {
			t.push(`fearfully. ${He} doesn't want to make a fool of ${him}self, or damage anything by hurrying, and ${he} blushes dreadfully as ${he} keeps working at it.`);
		}
		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Help ${him}`, help),
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Fuck ${him}`, fuck, fuckNote())
				: new App.Events.Result(),
		]);

		function help() {
			// replace slave art
			$(artDiv).empty();
			App.Events.drawEventArt(artDiv, eventSlave);

			t = [];
			t.push(`Deciding to help ${him}, you head over and grab a handful of each of ${his} asscheeks, hefting ${him}`);
			t.push(eventSlave.buttImplant / eventSlave.butt >= 0.5 ? "unnaturally taut" : "soft");
			t.push(`masses of feminine assflesh upward and out of the constricting clothing.`);
			if (((eventSlave.fetishKnown === 1) && (eventSlave.fetish === "buttslut")) || (eventSlave.energy > 80)) {
				t.push(`${He}'s a little disappointed when ${he} realizes that you're just being helpful, instead of getting ready to stick`);
				t.push(V.PC.dick !== 0 ? "your dick" : "something");
				t.push(`inside ${him}, but ${he} thanks you properly once ${he}'s free. Clearly unwilling to leave it at just that, ${he} gives you quite a show as ${he} gets into the next size up, making sure to bounce ${his} ass for you and keeping ${his}`);
				if (!canDoVaginal(eventSlave)) {
					t.push(`ass`);
				}
				t.push(`pussy visible for longer than is strictly necessary. ${He} trusts you'll fuck ${him} some other time, and is even a little happy that you're willing to lend ${him} a helping hand outside of sex.`);
			} else if (eventSlave.trust > 20) {
				t.push(`${He} feels the familiar grip of your`);
				t.push(V.PC.title === 1 ? "strong" : "feminine");
				t.push(`hands without surprise or resentment, and relaxes trustingly as you manipulate ${his} bottom. Realizing that you're helping ${him}, ${he} quickly slides the offending item down ${his}`);
				t.push(hasBothLegs(eventSlave) ? "thighs" : "thigh");
				t.push(`and off ${him}self, and then thanks you properly. ${He} smiles at you as ${he} puts on the next size up, clearly pleased that you'd assist ${him} with a trivial thing outside of ${his} direct duties as a sex slave.`);
			} else {
				t.push(`${He} stiffens at the feeling of your hands on ${his} bottom, not sure whether you're about to ram`);
				t.push(V.PC.dick !== 0 ? "your dick" : "something");
				t.push(`up ${his} defenseless asshole. You feel the muscles down there tense a little through the softness of the lower part of ${his} buttocks. That's not what you're planning, though, and eventually ${he} realizes that you mean to help. ${He} thanks you hesitantly before bending to slide the offending clothing down ${his}`);
				t.push(hasBothLegs(eventSlave) ? "thighs." : "thigh.");
				t.push(`Nervously, ${he} thanks you again after ${he}'s free, unsure of ${him}self but <span class="mediumaquamarine">impressed that you'd help ${him} with a little thing like that.</span>`);
			}
			eventSlave.trust += 5;
			return t;
		}
		function fuck() {
			t = [];
			t.push(`Finding the situation simply too good to pass up, you wait until ${he}'s not`);
			t.push(canSee(eventSlave) ? "looking at" : "paying attention to");
			t.push(`you, and then approach ${him} from behind.`);
			if ((eventSlave.fetishKnown === 1) && (eventSlave.fetish === "buttslut") && canDoAnal(eventSlave)) {
				t.push(`${He} gasps wantonly as ${he} feels the familiar sensation of`);
				t.push(V.PC.dick !== 0 ? "your dick" : "a strap-on");
				t.push(`infiltrating between ${his} cheeks and towards ${his}`);
				if (eventSlave.anus >= 3) {
					t.push(`loose`);
				} else if (eventSlave.anus >= 2) {
					t.push(`relaxed`);
				} else {
					t.push(`tight little`);
				}
				t.push(`anus. ${He} releases ${his} grip on the constricting clothing that's binding ${his} thighs together and grinds ${his} ass back against you, making sure every`);
				t.push(V.showInches === 2 ? "inch" : "centimeter");
				t.push(`of your`);
				t.push(V.PC.dick !== 0 ? "hard member" : "phallus");
				t.push(`that will fit gets inside ${his} asshole. Some time later, the hard pounding dislodges the clothing and it slides down ${his}`);
				t.push(hasBothLegs(eventSlave) ? "legs" : "leg");
				t.push(`to gather around ${his}`);
				t.push(hasBothLegs(eventSlave) ? "ankles." : "ankle.");
				t.push(`<span class="hotpink">${He} doesn't notice.</span>`);
				t.push(VCheck.Anal(1, eventSlave));
			} else if (eventSlave.energy > 80) {
				t.push(`${He}'s so horny that ${he} doesn't need any foreplay. Nor does ${he} get any. You grab ${his} hips and smack your`);
				t.push(V.PC.dick !== 0 ? "dick" : "strap-on");
				t.push(`against ${his} jiggling buttocks a couple of times, making ${his} bounce with eagerness and frustration at the anticipation of imminent sexual release. Exercising mercy, you pull ${his} ass back against you and maneuver`);
				t.push(V.PC.dick !== 0 ? "yourself" : "your instrument");
				t.push(`inside ${him}, enjoying ${his} shiver at the satisfaction of ${his} hopes. The constricting clothes pin ${his} legs together, and you hold ${his} arms against ${his} sides, keeping ${his} back pressed against your`);
				if (V.PC.belly > 1500) {
					t.push(`pregnancy`);
				} else if (V.PC.boobs >= 300) {
					if (V.PC.boobsImplant !== 0) {
						t.push(`fake`);
					}
					t.push(`breasts`);
				} else if (V.PC.title === 0) {
					t.push(`flat chest`);
				} else {
					t.push(`muscular chest`);
				}
				t.push(`as you take ${him}.`);
				t.push(canDoVaginal(eventSlave) ? VCheck.Vaginal(1, eventSlave) : VCheck.Anal(1, eventSlave));
			} else if (eventSlave.trust > 20) {
				t.push(`${He} relaxes submissively when ${he} feels you take hold of ${his} huge ass and slide your`);
				t.push(V.PC.dick !== 0 ? "dick" : "strap-on");
				t.push(`between ${his} asscheeks and then inside ${his}`);
				t.push(canDoVaginal(eventSlave) ? "pussy." : "anus.");
				t.push(`${His} legs are already in effect bound by the constricting clothing that's still holding them together, and you enhance the effect by taking hold of ${his} wrists and hugging ${him} from behind as you fuck ${him}, holding ${his}`);
				t.push(hasBothLegs(eventSlave) ? "arms crossed" : "arm");
				t.push(`across ${his}`);
				if (eventSlave.boobs > 2000) {
					t.push(`massive breasts.`);
				} else if (eventSlave.boobs > 300) {
					t.push(`boobs.`);
				} else {
					t.push(`chest.`);
				}
				t.push(`Helpless in your embrace, ${he} <span class="hotpink">relaxes completely and lets it happen.</span>`);
				t.push(canDoVaginal(eventSlave) ? VCheck.Vaginal(1, eventSlave) : VCheck.Anal(1, eventSlave));
			} else {
				t.push(`${He} stiffens fearfully when ${he} feels you take hold of ${his} huge ass, but ${he} knows not to resist. ${He} stays still as you slide your`);
				t.push(V.PC.dick !== 0 ? "dick" : "strap-on");
				t.push(`between ${his} asscheeks and then inside ${his}`);
				t.push(canDoVaginal(eventSlave) ? "pussy," : "anus");
				t.push(`trying to angle ${his} hips to make the standing penetration less uncomfortable. The clothing binds ${his} legs together, reducing ${him} to simply sticking ${his} butt out as best ${he} can to ease the stroking of your`);
				t.push(V.PC.dick !== 0 ? "cock," : "phallus,");
				t.push(`invading ${his} helpless`);
				if (canDoVaginal(eventSlave)) {
					t.push("cunt.");
					t.push(VCheck.Vaginal(1, eventSlave));
				} else {
					t.push("asshole.");
					t.push(VCheck.Anal(1, eventSlave));
				}
				t.push(`When you're done, you extract yourself and stalk off, leaving ${him} to struggle free`);
				if (V.PC.dick !== 0) {
					t.push(`and try to keep the cum dripping out of ${him} off ${his} clothing`);
				}
				t.push(t.pop() + ".");
				t.push(`${He} stumbles back to fetch the right size, <span class="hotpink">thoroughly fucked.</span>`);
			}
			eventSlave.devotion += 5;
			return t;
		}

		function fuckNote() {
			if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
				return `This option will take ${his} virginity`;
			} else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave) && (eventSlave.anus === 0)) {
				return `This option will take ${his} anal virginity`;
			}
			return null;
		}
	}
};


code:
App.Events.RESSHotPC = class RESSHotPC extends App.Events.BaseEvent {
	eventPrerequisites() {
		return []; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.energy > 40,
				s => s.devotion > 0 && s.devotion <= 50,
				s => s.trust >= -50,
				canSee,
				hasAnyArms,
				hasAnyLegs,
				s =>
					(s.attrXX >= 50 && V.PC.belly < 5000 && (V.PC.boobs >= 300 || V.PC.title === 0)) ||
					(s.attrXY >= 50 && V.PC.dick > 0 && V.PC.boobs < 300 && V.PC.belly < 1500) ||
					(s.fetish === "pregnancy" && V.PC.belly >= 5000) ||
					(s.fetish === "boobs" && V.PC.belly < 5000 && V.PC.boobs >= 1000),
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, hers, him, himself, girl
		} = getPronouns(eventSlave);
		const {s, S, ss, title: Master} = getEnunciation(eventSlave);

		/** @type {App.Entity.PlayerState} */
		let PC = V.PC;

		V.nextLink = "Next Week";

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
			t.push(`You maintain a tremendous workout routine: the leader of a society that worships physical perfection can afford nothing less. Working out maintains your appearance, keeps you sharp, and makes you the exemplar of the physical ideal that you have to be for your vision for the future to be realized. So, you pay the iron price for your ${PC.title === 1 ? "muscles" : "toned body"}. Like most of the arcology's prominent citizens, you often lift publicly and take part in other amateur sports, but you also have your own private weight room in your penthouse, and you spend a lot of time there.`);
		} else if (PC.physicalAge >= 50) {
			t.push(`You take care of yourself. You're no longer as young as you once were, making it almost a requirement that you work out, hard and regularly. The fact is, the overwhelming majority of arcology owners who maintain their positions for more than a short time are physically fit. The Free Cities have a reputation for destroying old world wastrels who inherit wealth and think that makes them able to survive in an anarcho-capitalist world. Sloth and an inability to self-govern are not qualities common among your successful peers. Not to mention, it's useful to look good, and it may well prove essential to be physically capable in the near future.`);
		} else {
			t.push(`You take care of yourself. It would be absurd to think that there's any explicit requirement that you work out, hard and regularly, but the fact remains that the overwhelming majority of arcology owners who maintain their positions for more than a short time are physically fit. The Free Cities have a reputation for destroying old world wastrels who inherit wealth and think that makes them able to survive in an anarcho-capitalist world. Sloth and an inability to self-govern are not qualities common among your successful peers. Not to mention, it's useful to look good, and it may well prove essential to be physically capable in the near future.`);
		}

		App.Events.addParagraph(node, t);
		t = [];

		t.push(`You complete the final rep of your first workout of the day, rack the bar, and jump to your feet to shower, change, and see to your empire. The motion brings your field of view up, and you notice for the first time that`);
		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`is frozen in the open doorway, having seen something in the workout room that caught ${his} attention as ${he} passed by. ${His} eyes are fixed on your`);
		if (PC.belly >= 120000) {
			t.push(`massive pregnancy with almost painful intensity. You can't really blame ${him}; you're the perfect image of a fertile goddess and your overfilled belly is coated in sweat. Even though you can't work your core any longer, you still take your workouts seriously, something most pregnant women would shy away from. You flush a little at what must ${he} must have thought; will all the grunting and effort, ${he} likely thought you were giving birth.`);
		} else if (PC.belly >= 100000) {
			t.push(`massive pregnancy with almost painful intensity. You can't really blame ${him}; you're eye-catchingly gravid and your full belly is coated in a thin sheen of sweat. Even though you can't work your core any longer, you still take your workouts seriously, something most pregnant women would shy away from.`);
		} else if (PC.belly >= 60000) {
			t.push(`giant pregnancy with almost painful intensity. You can't really blame ${him}; you're eye-catchingly massive and your heavy belly is coated in a thin sheen of sweat.`);
		} else if (PC.belly >= 15000) {
			t.push(`advanced pregnancy with almost painful intensity. You can't really blame ${him}; you're the perfect image of a mother-to-be and your heavy belly is coated in a thin sheen of sweat.`);
		} else if (PC.belly >= 10000) {
			t.push(`heavily pregnant middle and the last remnants of your abs with almost painful intensity. You can't really blame ${him}; you're the perfect image of a mother-to-be and your heavy belly is coated in a thin sheen of sweat.`);
		} else if (PC.belly >= 5000) {
			t.push(`greatly swollen middle and its stretched abdominal muscles with almost painful intensity. You can't really blame ${him}; despite how big you've gotten, you still have some abs left.`);
		} else if (PC.boobs >= 1400) {
			t.push(`sports bra clad boobs with almost painful intensity. You can't really blame ${him}; the bra is three sizes too small, forcing your enormous ${PC.boobsImplant > 0 ? "fake breasts to balloon around the strained material" : "breasts to lewdly bulge around the strained material"}, soaked in your sweat${PC.lactation > 0 ? " and breast milk" : ""}, and your nipples are clearly defined through the stretched thin fabric.`);
		} else if (PC.boobs >= 1200) {
			t.push(`sports bra clad boobs with almost painful intensity. You can't really blame ${him}; the bra is two sizes too small, allowing your huge ${PC.boobsImplant > 0 ? "fake" : ""} breasts to lewdly bulge out of them, soaked in your sweat${PC.lactation > 0 ? " and breast milk" : ""}, and your nipples are clearly visible as bumps in the strained material.`);
		} else if (PC.boobs >= 1000) {
			t.push(`sports bra clad boobs with almost painful intensity. You can't really blame ${him}; the bra is one size too small, allowing your big ${PC.boobsImplant > 0 ? "fake" : ""} breasts to bulge out of them, soaked in your sweat${PC.lactation > 0 ? " and breast milk" : ""}, and your nipples are clearly visible as bumps in the taut material.`);
		} else if (PC.boobs >= 300) {
			t.push(`sports bra clad boobs with almost painful intensity. You can't really blame ${him}; the bra is soaked in your sweat ${PC.lactation > 0 ? "and breast milk" : ""} and your nipples are clearly visible as bumps in the tight material.`);
		} else if (PC.belly >= 1500) {
			t.push(`swollen middle and its abdominal muscles with almost painful intensity. You can't really blame ${him}; despite your growing child ${PC.pregType > 1 ? "ren" : ""}, they're still pretty cut.`);
		} else if (PC.belly >= 100) {
			if (PC.title === 0) {
				t.push(`slightly distended abdominal muscles and flat chest with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your sports bra's soaked in your sweat ${PC.lactation > 0 ? "and breast milk" : ""} and your nipples are clearly visible as bumps in the tight material.`);
			} else {
				t.push(`slightly distended abdominal muscles with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your bare chest is coated in a light sheen of glistening sweat.`);
			}
			if (PC.pregKnown === 1) {
				t.push(`You doubt ${he} realizes that the slight swell to your middle is a child.`);
			}
		} else {
			if (PC.title === 0) {
				t.push(`abdominal muscles and flat chest with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your sports bra's soaked in your sweat${PC.lactation > 0 ? "and breast milk" : ""} and your nipples are clearly visible as bumps in the tight material.`);
			} else {
				t.push(`abdominal muscles with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your bare chest is coated in a light sheen of glistening sweat.`);
			}
		}

		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${His} ${App.Desc.eyesColor(eventSlave)} track up your torso comically until ${he}'s looking into your eyes. ${He} stares dumbly at you for a moment before realizing what ${he}'s doing and blushes with embarrassment. ${He}'s reasonably well broken, but is still coming to terms with ${his} sexual place as a ${SlaveTitle(eventSlave)}.`);
		t.push(`In particular, ${he} hasn't gotten used to the effects of ${his} training, the slave food, and the atmosphere in the penthouse, all of which are serving to fuel an acceleration of ${his} sex drive.`);
		if (!canTalk(eventSlave)) {
			t.push(`${He} uses shaky ${hasBothArms(eventSlave) ? "hands" : "gestures"} to ask you to fuck ${him},`);
		} else {
			t.push(`"${S}orry, ${Master}, I was ju${s}t, um, pa${ss}ing by and I thought, um, I ${s}aw, um, ${s}orry ${Master}, I'm going now," ${he} babbles,`);
		}
		t.push("and turns to flee.");

		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result("Not so fast", caught),
			new App.Events.Result(`Let ${him} go`, released),
		]);

		function caught() {
			const belly = bellyAdjective(eventSlave);
			t = [];
			t.push(`As ${he} goes, ${he} follows the natural human impulse when embarrassed, and turns ${his} head resolutely away from you, trying very hard to forget making such a fool of ${himself}. This means that ${he} does not see your rapid, predatory pursuit of ${him}, nor does ${he} ${canHear(eventSlave) ? "hear" : "notice"} your careful stride across the flooring. ${His} first indication that ${he}'s prey is when your hands grab ${him} around ${his}`);
			if (eventSlave.bellyPreg >= 5000) {
				t.push(`pregnant belly`);
			} else if (eventSlave.belly >= 5000) {
				t.push(`${belly} belly`);
			} else if (eventSlave.weight > 130) {
				t.push("gut");
			} else if (eventSlave.weight > 95) {
				t.push("fat belly");
			} else if (eventSlave.muscles > 30) {
				t.push("own well-muscled middle");
			} else if (eventSlave.weight > 10) {
				t.push("plush belly");
			} else {
				t.push("middle");
			}
			t.push(`and hug ${him} hard against your`);
			if (PC.belly >= 100000) {
				t.push("massive sweaty pregnancy.");
			} else if (PC.belly >= 60000) {
				t.push("giant sweaty pregnancy.");
			} else if (PC.belly >= 15000) {
				t.push("huge sweaty pregnancy.");
			} else if (PC.belly >= 5000) {
				t.push("sweaty pregnancy.");
			} else if (PC.boobs >= 1400) {
				t.push("enormous sweaty boobs.");
			} else if (PC.boobs >= 1200) {
				t.push("huge sweaty boobs.");
			} else if (PC.boobs >= 1000) {
				t.push("big sweaty boobs.");
			} else if (PC.boobs >= 300) {
				t.push("sweaty boobs.");
			} else {
				t.push(PC.title === 0 ? "sweaty, flat chest." : "sweaty, bare chest.");
			}
			t.push(`${He} stiffens ${eventSlave.voice !== 0 ? "and shrieks" : ""} with surprise, but relaxes obediently within your embrace. Your warm, animal presence has an immediate effect. You hear ${him} suck in ${his} breath and then feel ${him} begin to breathe increasingly hard as your ${canSmell(eventSlave) ? "scent" : "body heat"} sinks into ${him} and ${his} embarrassment fades.`);

			App.Events.addParagraph(node, t);
			t = [];

			App.Events.addResponses(node, [
				((canDoVaginal(eventSlave) || canDoAnal(eventSlave)))
					? new App.Events.Result(`Fuck ${him} right here`, fuck, virginityWarning())
					: new App.Events.Result(virginityWarning()),
				new App.Events.Result(`Have ${him} lick you clean`, lick),
			], "result2");

			function fuck() {
				t = [];

				if (PC.title === 0 || PC.boobs >= 300 || PC.belly >= 1500) {
					t.push("Despite your feminine appearance, you have capable hands.");
				} else {
					t.push("You have strong hands to go with your masculine appeal.");
				}
				t.push(`They rove across ${his} front, hugging ${him} hard against you as you massage and grope.`);
				if (eventSlave.boobs > 4000) {
					t.push(`${His} tits are so big that hefting them creates a bit of a burn in your biceps, in addition to making ${him} writhe against you.`);
				} else if (eventSlave.belly >= 10000) {
					t.push(`The skin that covers ${his} swollen belly is erotically taught, and you run your fingers across it possessively.`);
				} else if (eventSlave.nipples === "inverted") {
					t.push(`You wrap your hands around the bases of ${his} inverted nipples, and use your strong grip to stimulate and squeeze them until they protrude, much to the writhing slave's anguish.`);
				} else if (eventSlave.nipples === "fuckable") {
					t.push(`You slip your fingers into ${his} nipples and spread them wide, making the slave writhe and buck against you.`);
				} else {
					t.push(`You pinch ${his} nipples and tug them hard, making the slave writhe and buck against you.`);
				}
				if (PC.dick === 0) {
					if (hasBothArms(eventSlave)) {
						t.push(`You grab one of ${his} hands and guide it down to ${his}`);
					} else if (hasAnyArms(eventSlave)) {
						t.push(`You grab ${his} hand and guide it down to ${his}`);
					} else {
						t.push(`You `);
					}
					if (eventSlave.dick > 0 && !(eventSlave.chastityPenis)) {
						t.push("cock,");
					} else if (canDoVaginal(eventSlave)) {
						t.push("pussy,");
					} else if (eventSlave.scrotum > 0 && eventSlave.balls > 1) {
						t.push("testicles,");
					} else if ((eventSlave.chastityPenis === 1)) {
						t.push("caged dick,");
					} else if ((eventSlave.chastityVagina)) {
						t.push("chastity belt,");
					} else if (eventSlave.vagina === -1) {
						t.push("perineum,");
					}
					t.push(`making ${him} play with ${himself}. Meanwhile, you look after your womanhood with your other hand, schlicking expertly while holding ${him} close, ensuring that ${he} feels every motion of what you're doing. When your fingers are thoroughly coated with pussyjuice, you drop ${his} hand, letting ${him} continue masturbating on ${his} own, and then use the freed hand to replace the one you're using to touch yourself. Then, you take the wet fingers and push them into ${his} mouth; ${he} willingly sucks them clean, using ${his} tongue to gather every trace of your secretions. You gather sweat from between your breasts, and make ${him} suck that off ${his} fingers too. When ${he} orgasms, you shove ${him} against the wall and hump against ${him} and your hand both, climaxing yourself.`);
				} else {
					t.push(`You pull ${him} up ${hasAnyLegs(eventSlave) ? `onto ${his} toes` : "to face you"} and slide yourself inside ${him}, the slave gasping when ${he} feels your hot dick enter ${his}`);
					t.push(canDoVaginal(eventSlave) ? "cunt." : "anus.");
					if (PC.belly >= 5000 && eventSlave.belly >= 10000) {
						t.push(`You'd like to lift ${him} up into a standing fuck, but there is so much distended stomach between the both of you that it's impossible so you opt for a position where you can both penetrate ${him} and continue your work out.`);
						if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
							t.push(`After a while, you shift positions, freeing your member, and force yourself up ${his} butt despite the slave's anxious begging.`);
							t.push(VCheck.Both(1, 1, eventSlave));
							t.push(`It doesn't take long before you fill ${his} ass with cum.`);
						} else {
							t.push((canDoVaginal(eventSlave)) ? fuckVagina() : fuckAss());
						}
					} else if (PC.belly >= 5000) {
						t.push(`You'd like to lift ${him} up into a standing fuck, but you are far too pregnant to manage. Instead, you lie on your back and have ${him} work your legs as you fuck ${him}.`);
						if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
							t.push(`After a while, you lift ${him} up as high as you can, freeing your member, and then lower ${him} back down again, forcing yourself up ${his} butt instead despite the slave's anxious begging.`);
							t.push(VCheck.Both(1, 1, eventSlave));
							t.push(`It doesn't take long before you fill ${his} ass with cum.`);
						} else {
							t.push((canDoVaginal(eventSlave)) ? fuckVagina() : fuckAss());
						}
					} else if (eventSlave.belly >= 300000) {
						t.push(`You'd like to lift ${him} up into a standing fuck, but even you aren't strong enough to lift ${his} extreme weight. Instead, you choose to have ${him} ride you; supporting ${his} ${belly} middle is a workout in its own right.`);
						if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
							t.push(`After a while, you push ${him} up as high as you can, freeing your member, and then lower ${him} back down again, forcing yourself up ${his} butt instead despite the slave's anxious begging.`);
							t.push(VCheck.Both(1, 1, eventSlave));
							t.push(`It doesn't take long before you fill ${his} ass with cum.`);
						} else {
							t.push((canDoVaginal(eventSlave)) ? fuckVagina() : fuckAss());
						}
					} else if (eventSlave.belly >= 100000) {
						t.push(`Once you're hilted, you hoist ${him} up by the underarms, shifting your stance to handle ${his} ${belly} stomach's weight, and hold ${him} in midair, impaled on your dick. You can't pound ${him} all that hard in this challenging position, but the effort of holding ${him} this way forces you to work out hard, producing an excellent sensation. ${PC.vagina !== -1 ? `The position angles your dick upward, producing a lovely massaging sensation in your pussy as you slide in and out of ${him}.` : ""}`);
						if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
							t.push(`After a while, you lift ${him} up as high as you can, freeing your member, and then lower ${him} back down again, forcing yourself up ${his} butt instead despite the slave's anxious begging.`);
							VCheck.Both(1, 1, eventSlave);
							t.push(`It doesn't take long before you fill ${his} ass with cum.`);
						} else {
							t.push((canDoVaginal(eventSlave)) ? fuckVagina() : fuckAss());
						}
						t.push("You're going to be feeling this tomorrow.");
					} else {
						t.push(`Once you're hilted, you bring ${his} hands up on either side of ${his} head to grasp your shoulders behind ${him}, and then scoop ${his} legs up and hoist ${him} to rest against your chest, held in midair and impaled on your dick. You can't pound ${him} all that hard in this challenging position, but the effort of holding ${himself} this way forces ${him} to tighten ${his} muscles down hard, producing an excellent sensation. ${PC.vagina !== -1 ? `The position angles your dick upward, producing a lovely massaging sensation in your pussy as you slide in and out of ${him}` : ""}.`);
						if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
							t.push(`After a while, you lift ${him} up as high as you can, freeing your member, and then lower ${him} back down again, forcing yourself up ${his} butt instead despite the slave's anxious begging.`);
							t.push(VCheck.Both(1, 1, eventSlave));
							t.push(`It doesn't take long before you fill ${his} ass with cum.`);
						} else {
							t.push((canDoVaginal(eventSlave)) ? fuckVagina() : fuckAss());
						}
					}
				}

				function fuckVagina() {
					return `${VCheck.Vaginal(1, eventSlave)} It doesn't take long before you fill ${his} pussy with cum.`;
				}

				function fuckAss() {
					return `${VCheck.Anal(1, eventSlave)} It doesn't take long before you fill ${his} ass with cum.`;
				}

				t.push(`You tell your quivering sex toy that ${he} doesn't have to be embarrassed about ${his} needs. ${He} seems relieved that the sexual being ${he}'s becoming is acceptable, at least to you.`);
				eventSlave.trust += 4;
				return t;
			}

			function lick() {
				t = [];

				t.push(`You take ${him} by the hand and ${PC.belly >= 10000 ? "waddle" : "walk"} towards the shower. The sudden loss of your closeness jerks ${him} rudely out of ${his} sexual reverie, but ${he} follows willingly, perhaps distracted by the view as you shed your workout clothes on the way. When you get there, you pull ${him} in with you, but you do not turn on the water. Instead, you tell ${him} to wash you. Not understanding, ${he} turns to switch on the shower, but you catch ${him}, and insert two sweaty fingers into the slave's compliant mouth. ${He} sucks on them, taking refuge in the simple task, and then understands what you mean. ${He} runs ${his} tongue up your arm, sucking the salty sweat off you as best ${he} can. Soon, ${he} bends down and heads for your`);
				if (PC.dick !== 0 && PC.vagina !== -1) {
					t.push("cock and cunt");
				} else if (PC.dick !== 0) {
					t.push("cock");
				} else if (PC.vagina !== -1) {
					t.push("cunt");
				}
				t.push(`but you pull ${him} up again and tell ${him} to do that last.`);
				if (PC.belly >= 60000) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up your linea nigra. When ${he} reaches your ${PC.preg >= 22 ? "popped" : "flattened"} navel, you hold ${his} head there for a while, savoring the erotic sensation before pushing ${him} along to the rest of your expansive midriff.`);
				} else if (PC.belly >= 5000) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up your linea nigra. When ${he} reaches your ${PC.preg >= 22 ? "popped" : "flattened"} navel, you hold ${his} head there for a while, savoring the erotic sensation.`);
				} else if (PC.boobs >= 1400) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up the sweaty crevice between your enormous breasts. When ${he} reaches your nipples, you hold ${his} head there for a while, enjoying ${his} tongue.`);
				} else if (PC.boobs >= 1200) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up the sweaty crevice between your huge breasts. When ${he} reaches your nipples, you hold ${his} head there for a while, enjoying ${his} tongue.`);
				} else if (PC.boobs >= 1000) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up the sweaty crevice between your big breasts. When ${he} reaches your nipples, you hold ${his} head there for a while, enjoying ${his} tongue.`);
				} else if (PC.boobs >= 300) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up the sweaty crevice between your breasts. When ${he} reaches your nipples, you hold ${his} head there for a while, enjoying ${his} tongue.`);
				} else {
					t.push(`${He} settles for kissing and licking ${his} way up your abs, pecs, and`);
					if (PC.title === 0) {
						t.push(`non-existent tits. When ${he} reaches your nipples, you hold ${his} head there for a while, enjoying ${his} tongue.`);
					} else {
						t.push(`collarbone, before shyly sucking the line of sweat that runs down each of your temples when you perspire heavily off of you.`);
					}
				}
				t.push(`When you've enjoyed the tongue bath enough, you reach over and activate the shower, the warm water producing a hum from the slave. You coach ${him} towards your`);
				if (PC.dick === 0) {
					t.push(`cunt, and ${he} eats you out with enthusiasm`);
				} else {
					t.push(`stiff prick, and ${he} gives you an enthusiastic blowjob ${PC.vagina !== -1 ? `before turning ${his} oral attentions to your pussy` : ""}`);
				}
				t.push(`as the water plays over you both. After looking up and letting the water cascade down your face for a long moment, you quietly tell ${him} to masturbate before opening your mouth to drink from the downpour. With your eyes closed against the stream, your only indications that ${he}'s obeying the command is a slight increase in the force with which ${he} sucks, and a faint`);
				if (canDoVaginal(eventSlave)) {
					t.push("schlicking");
				} else if (eventSlave.dick > 0 && canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					t.push("wanking");
				} else {
					t.push("rubbing");
				}
				t.push(`noise as ${he} jerks off. ${He} must find you quite attractive, since giving you oral in the shower while playing with ${himself} brings ${him} to orgasm with almost indecent speed.`);
				eventSlave.devotion += 4;
				seX(eventSlave, "oral", PC, "penetrative");
				return t;
			}
			return t;
		}

		function released() {
			t = [];
			t.push(`You let ${him} go, and ${he} hurries off to go on with ${his} day. But ${his} attraction to you does not go away, and neither does the embarrassment of having made a fool of ${himself} in front of you. The experience leaves ${him} a bit worried about how life as your slave is affecting ${him}, but increasingly infatuated with you. Before long, love will conquer doubt.`);
			eventSlave.devotion += 4;
			eventSlave.trust -= 2;
			return t;
		}

		function virginityWarning() {
			if (V.PC.dick > 0) {
				if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
					return `This option will take ${his} virginity`;
				} else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave) && (eventSlave.anus === 0)) {
					return `This option will take ${his} anal virginity`;
				}
			}
			return null;
		}
	}
};


code:
App.Events.RESSLazyEvening = class RESSLazyEvening extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				s => s.assignment === Job.FUCKTOY,
				s => s.devotion > 20,
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, hers, him, himself, girl, woman
		} = getPronouns(eventSlave);
		const {s, title} = getEnunciation(eventSlave);

		V.nextLink = "Next Week";

		/** @param {App.Entity.SlaveState} slave */
		function getSceneClothes(slave) {
			if (getLimbCount(slave, 102) > 2) {
				return "an oversized t-shirt";
			} else if (slave.boobs > 4000) {
				return "an oversized t-shirt"; /* loose pajama top */
			} else if (slave.intelligence+slave.intelligenceImplant > 50) {
				return "a halter top dress";
			} else if (slave.muscles > 30) {
				if (isItemAccessible.entry("sport shorts", "clothing")) {
					if (slave.boobs >= 650) {
						return "sport shorts and a sports bra";
					} else {
						return "sport shorts";
					}
				} else {
					return "spats and a tank top";
				}
			} else if (slave.energy > 95) {
				return null; // no change of clothes
			} else {
				return "conservative clothing";
			}
		}

		App.Events.drawEventArt(node, eventSlave, getSceneClothes(eventSlave));

		let t = [];
		t.push(`Although your life as an arcology owner comes with many associated privileges, extended idleness to bask in your luxury is not often among them. Thankfully, ${V.assistant.name} knows better than to let you run yourself ragged from the weight of your assorted responsibilities and often allots time in the evenings of your active schedule to simply relax.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`Of course, no self respecting arcology owner could be expected to enjoy a lazy night of idle relaxation on their own. As you resolve the last of your most pressing responsibilities for the evening, ${V.assistant.name} directs one of your attentive slaves to gently guide you away from the unending burdens of running your arcology. Leaning against the doorway and wearing a facsimile of what an old world ${woman} might wear on a casual night in,`);
		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		if (!canTalk(eventSlave)) {
			t.push(`asks with a gesture that carries just the right mixture of submission and exaggerated casualness if you'd like to 'hang out.'`);
		} else if (SlaveStatsChecker.checkForLisp(eventSlave)) {
			t.push(`lisps with exaggerated casualness, "Let'${s} hang out, ${title}?"`);
		} else {
			t.push(`asks with exaggerated casualness, "Want to hang out, ${title}?"`);
		}
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`${He} saunters over and`);
		if (eventSlave.belly >= 100000) {
			t.push(`struggles to lower ${his} ${bellyAdjective(eventSlave)} form to an obedient kneel`);
		} else if (eventSlave.belly >= 10000) {
			t.push(`gingerly lowers ${his} heavily ${eventSlave.bellyPreg > 3000 ? "gravid" : "swollen"} form to an obedient kneel`);
		} else if (eventSlave.belly >= 5000) {
			t.push(`gently lowers ${his} ${eventSlave.bellyPreg > 3000 ? "gravid" : "swollen"} form to an obedient kneel`);
		} else {
			t.push(`kneels obediently`);
		}
		t.push(`in front of you, awaiting further direction.`);

		/* If you are updating below, please consider updating the vector art swaps at the top to match. */
		if (getLimbCount(eventSlave, 102) > 2) {
			t.push(`Clad in an antique T-Shirt referencing some defunct old world website, ${his} P-Limbs stand in stark contrast — gyros and servomotors against simple thread and cloth. With such tangible examples of the technological prowess of the Free Cities serving as ${his} limbs, ${his} ${eventSlave.belly >= 5000 ? "taut " : ""} shirt is an amusing testimonial to how far behind the old world stands in contrast to the new.`);
		} else if (eventSlave.boobs > 4000) {
			t.push(`${His} breasts are so massive that the front of ${his} loose pajama top must be unbuttoned. Even so, the protrusion of ${his} immense breasts${eventSlave.belly >= 5000 ? ` and ${bellyAdjective(eventSlave)} rounded belly` : ""} from ${his} chest strains the soft pajama top to it's breaking point.`);
		} else if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
			t.push(`As a clever ${girl}, ${his} simple${eventSlave.belly >= 5000 ? `, yet tight around the middle,` : ""} summer dress evokes memories of bygone warm weather days at elite old world colleges — and the sexual conquest of their youthful residents.`);
		} else if (eventSlave.muscles > 30) {
			t.push(`${His} simple sports bra and compression shorts ensemble does little to conceal ${his} incredible musculature,`);
			if (eventSlave.belly >= 1500) {
				t.push(`straining to hold up against ${his} swelling middle and`);
			}
			t.push(`glistening with sweat from a recent workout. Despite ${his} recent exertions, ${he}'s able to maintain utter stillness in the perfect posture of an obedient slave.`);
		} else if (eventSlave.energy > 95) {
			t.push(`${He}'s controlling ${his} absurd sex drive for the moment in deference to the notion of your relaxation time, but ${he} clearly wouldn't mind some sex as part of the evening.`);
			if (eventSlave.dick > 0) {
				if (canAchieveErection(eventSlave)) {
					t.push(`${His} cock is painfully erect`);
					if (eventSlave.belly >= 10000) {
						t.push(`and pressed against the underside of ${his} belly,`);
					}
				} else {
					t.push(`${His} soft dick is dribbling precum,`);
				}
			} else {
				t.push(`${His} pussy is visibly soaked,`);
			}
			t.push(`showing unmistakably how badly ${he} needs release.`);
		} else {
			t.push(`${He} keeps ${his}`);
			if (canSee(eventSlave)) {
				t.push(App.Desc.eyesColor(eventSlave));
			} else {
				t.push("face");
			}
			t.push(`slightly downcast, ${his} hands lightly smoothing the folds from ${his} tight skirt while ${his} breasts visibly rise and fall under ${his} even tighter blouse.`);
			if (eventSlave.belly >= 5000) {
				t.push(`Between the two, there is little ${he} can do to cover ${his} exposed ${eventSlave.bellyPreg >= 3000 ? "pregnancy" : "middle"}.`);
			 }
			 t.push(`${He}'s the perfect picture of an attentive little old world ${girl}friend ${eventSlave.height > 185 ? ` (though, of course, ${he}'s anything but physically small)` : ""}.`);
		}
		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result("Enjoy some oral with an evening of wallscreen television", flixAndChill),
			new App.Events.Result("Spend the night idly cuddling", cuddle),
			new App.Events.Result(`Unwind by tormenting ${him}`, torture)
		]);

		function flixAndChill() {
			let t = [];
			t.push(`There are some things that never change, even after ascension to the high position of an arcology owner. One of these fixtures of life is the ability to enjoy a relaxing evening of wallscreen television and`);
			if (V.PC.dick !== 0) {
				t.push("a blowjob");
				if (V.PC.vagina !== -1) {
					t.push("and");
				}
			}
			if (V.PC.vagina !== -1) {
				t.push("some cunnilingus");
			}
			t.push(t.pop() + ".");
			t.push(`With ${eventSlave.slaveName} sequestered between your legs, you tune into your favorite Free Cities serial drama and widen your legs slightly as you sink back into the chair with a sigh of contentment. ${He}`);
			if (eventSlave.belly >= 300000) {
				t.push(`gently leans onto ${his} ${bellyAdjective(eventSlave)} belly`);
				if (hasAnyArms(eventSlave)) {
					t.push(`with ${his} arm${hasBothArms(eventSlave) ? "s" : ""} steadying the mass`);
				}
			} else if (eventSlave.belly >= 5000) {
				if (hasAnyLegs(eventSlave)) {
					t.push(`kneels carefully`);
				} else {
					t.push(`lowers ${himself}`);
				}
				if (hasAnyArms(eventSlave)) {
					t.push(`with ${hasBothArms(eventSlave) ? `an` : `${his}`} arm`);
					if (eventSlave.bellyPreg >= 3000) {
						t.push(`wrapped protectively around ${his} bump`);
					} else {
						t.push(`cradling ${his} ${bellyAdjective(eventSlave)} belly`);
					}
				}
			} else {
				t.push(`sinks to`);
				if (hasAnyLegs(eventSlave)) {
					t.push(`${his} knee${hasBothLegs(eventSlave) ? "s" : ""} obediently`);
					if (hasAnyArms(eventSlave)) {
						t.push(`with ${his} hand${hasBothArms(eventSlave) ? "s" : ""} placed placidly on ${his} thigh${hasBothLegs(eventSlave) ? "s" : ""}`);
					}
				} else {
					t.push("the ground");
				}
			}
			t.push(`before putting ${his} mouth to work,`);
			if (eventSlave.skill.oral >= 100) {
				t.push(`${his} mastery at giving oral providing a wealth of pleasure.`);
			} else if (eventSlave.skill.oral > 60) {
				t.push(`${his} skills in oral providing ample pleasure.`);
			} else {
				t.push(`${his} mediocre oral skills providing some relief.`);
			}
			if (eventSlave.teeth === "pointy") {
				t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you still feel the extreme care ${he} has to take to keep ${his} shark-like teeth clear of you.`);
			} else if (eventSlave.teeth === "fangs") {
				t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the slight hesitations as ${he} takes care to not scratch you with ${his} fangs.`);
			} else if (eventSlave.lips > 40) {
				t.push(`${His} huge lips are soft and pillowy against you.`);
			} else if (eventSlave.teeth === "fang") {
				t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the care ${he} is taking to keep ${his} fang from clipping you.`);
			} else if (eventSlave.teeth === "gapped") {
				t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the slight hesitations as ${he} takes care to not pinch you between ${his} front teeth.`);
			} else if ((eventSlave.teeth === "straightening braces") || (eventSlave.teeth === "cosmetic braces")) {
				t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the slight hesitations as ${he} takes care to keep ${his} braces off you.`);
			}
			t.push(`You have an enjoyable evening glued to your wallscreen, punctuated by the playful ruffling ${eventSlave.hLength > 1 ? `of ${eventSlave.slaveName}'s ${eventSlave.hColor} hair` : `across ${eventSlave.slaveName}'s scalp`} and the occasional orgasm into ${his} waiting mouth.`);
			if (eventSlave.sexualFlaw !== "hates oral") {
				t.push(`Though your experience was more stimulating than ${hers}, ${eventSlave.slaveName} <span class="devotion inc">enjoyed being used while you enjoyed yourself.</span>`);
				eventSlave.devotion += 4;
			} else {
				t.push(`Although you enjoyed ${his} ministrations, ${eventSlave.slaveName} had a bad time because of ${his} <span class="devotion dec">hate of oral.</span>`);
				eventSlave.devotion -= 2;
			}
			seX(eventSlave, "oral", V.PC, "penetrative");
			return t;
		}

		function cuddle() {
			let t = [];
			t.push(`Though your evening could hardly be called eventful, there is something eminently comforting about having a warm`);
			if (eventSlave.physicalAge > 30) {
				t.push(woman);
			} else if (eventSlave.physicalAge > 18) {
				t.push("young lady");
			} else if (eventSlave.physicalAge > 12) {
				t.push("teen");
			} else {
				t.push(`little ${girl}`);
			}
			t.push(`cuddled up beside you to idly while away the hours`);
			if (eventSlave.bellyPreg >= 1500 && eventSlave.pregSource === -1) {
				t.push(t.pop() + ",");
				t.push(`especially when ${he} is ${eventSlave.belly >= 300000 ? `so massively swollen with your children` : `heavy with your child${eventSlave.pregType > 1 ? "ren" : ""}`}`);
			}
			t.push(t.pop() + ".");
			t.push(`${He} <span class="trust inc">trusts you more</span> for these few intimate hours amidst ${his} life of sexual servitude.`);
			eventSlave.trust += 4;
			return t;
		}

		function torture() {
			let t = [];
			t.push(`Though there is no shortage of torments you inflict during the course of your day to day life as an arcology owner, there is something refreshing about torturing a slave out of idle boredom rather than corrective disciple or sexual domination. Your night is filled with ${eventSlave.voice === 0 ? "the horrible rasping that a mute throat substitutes for cries of agony" : "echoing shrieks of anguish"}, though every vocal outburst is idly punished with electro shock or strike of the whip. Come the morning, ${eventSlave.slaveName}`);
			if (eventSlave.fetish === "masochist") {
				t.push(`is mortified by the intensity of ${his} orgasms that night,<span class="devotion inc"> and more convinced than ever that ${he}'s a pain slut,</span> and yet`);
				eventSlave.devotion += 4;
			}
			t.push(`<span class="trust dec">scuttles away to tend to the bruises and marks that litter ${his} battered body.</span>`);
			eventSlave.trust -= 5;
			return t;
		}
	}
};