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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.assignment !== Job.QUARTER,
				s => s.physicalAge > 30,
				s => s.ageImplant > 0,
				s => s.devotion > 20,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const PC = V.PC;

		App.Events.drawEventArt(node, eventSlave, "no clothing");

		App.Events.addParagraph(node, [
			`In the morning the penthouse is a busy bustle of female energy. Slaves get up promptly, eat, shower, dress themselves, and head out to work. They chatter if able and allowed, and draw a good deal of strength from each other. As you pass by the kitchen, you are narrowly avoided by a rush of slaves heading to the showers. They're almost bouncing, feeding off each other's youthful energy. At the back of the pack is`,
			App.UI.DOM.combineNodes(contextualIntro(PC, eventSlave, true), `. ${He} looks as young as any of them, but after they're out, ${he} leans against the door frame for a moment and exhales slowly.`)
		]);
		let r = [];
		r.push(`${His} ${App.Desc.eyeColor(eventSlave)}-eyed gaze catches yours for a moment, and you are reminded that ${he} isn't as young as they are, not at all. ${His} face might look youthful, but ${his} eyes don't.`);
		if (canSee(eventSlave)) {
			r.push(`${He} sees your consideration, and murmurs,`);
		} else {
			r.push(`You make yourself known, and ${he} murmurs,`);
		}
		r.push(
			Spoken(eventSlave, `"Sorry, ${Master}. Just a little slow this morning."`),
			`${He} hurries after ${his} sisters, ${his}`
		);
		if (eventSlave.butt > 12) {
			r.push(`massive`);
		} else if (eventSlave.butt > 8) {
			r.push(`giant`);
		} else if (eventSlave.butt > 5) {
			r.push(`huge`);
		} else if (eventSlave.butt > 2) {
			r.push(`big`);
		} else {
			r.push(`pretty little`);
		}
		r.push(`naked ass catching your eye as ${he} goes.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Go out clubbing to make ${him} feel young again`, clubbing),
			new App.Events.Result(`Attend a sporting event with ${him}`, sporting),
			new App.Events.Result(`Put the old whore in ${his} place`, old, (eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) ? `This option will take ${his} virginity` : null),
		]);

		function clubbing() {
			r = [];
			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen; you tell ${him} to take the day off and meet you that evening for a trip to ${V.arcologies[0].name}'s most fashionable nightclub. You emphasize slightly that it's a place you prefer to enjoy with a young slave, and ${his} eyes widen a little at the implied compliment and challenge. Right at the proper time, ${he} arrives in your office wearing neon ${eventSlave.hColor} makeup to match ${his} hair, and a tiny iridescent club${girl} outfit of the same color. The hem of the skirt is barely low enough to conceal ${him}`);
			if (eventSlave.dick > 0) {
				r.push(`dick,`);
			} else if (eventSlave.vagina === -1) {
				r.push(`total lack of private parts,`);
			} else {
				r.push(`pussy,`);
			}
			r.push(`and it's backless. The front is held up by a halter around ${his} pretty neck, and is`);
			if (eventSlave.boobs > 2000) {
				r.push(`specially tailored to cover ${his} massive tits`);
			} else if (eventSlave.boobs > 1000) {
				r.push(`strained by ${his} big tits`);
			} else if (eventSlave.boobs > 300) {
				r.push(`tightly filled by ${his} healthy tits`);
			} else {
				r.push(`tight against ${his} flat chest`);
			}
			if (eventSlave.belly >= 1500) {
				r.push(`and ${belly}`);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
				r.push(`belly`);
			}
			r.push(r.pop() + `. ${He} makes a gaudy and very fashionable spectacle, and in response to your`);
			if (canSee(eventSlave)) {
				r.push(`look`);
			} else if (canHear(eventSlave)) {
				r.push(`whistle`);
			} else {
				r.push(`gentle poke`);
			}
			r.push(`${he} raises`);
			if (!hasAnyArms(eventSlave)) {
				r.push(`the stumps of ${his} arms ever so slightly`);
				if (hasBothArms(eventSlave)) {
					r.push(`both arms`);
				} else {
					r.push(`${his} arm`);
				}
				r.push(`over ${his} head`);
			}
			r.push(
				`and twirls, shimmying ${his} body deliciously.`,
				Spoken(eventSlave, `"I hope they let me into the club without checking my I.D., ${Master},"`),
				`${he} jokes, for which ${he} receives a swat on ${his} rear as you head out. With the full day of rest, ${he} is full of vigor and ready to dance. ${He} eagerly heads out onto the floor with you,`);
			if (eventSlave.skill.entertainment >= 100) {
				r.push(`masterfully moving ${his}`);
				if (eventSlave.belly >= 1500) {
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`gravid`);
					} else {
						r.push(`rounded`);
					}
				}
				r.push(`body to the heavy beat, grabbing the attention of all the men and most of the women in ${V.clubName}.`);
			} else if (eventSlave.skill.entertainment > 60) {
				r.push(`expertly moving ${his}`);
				if (eventSlave.belly >= 1500) {
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`gravid`);
					} else {
						r.push(`rounded`);
					}
				}
				r.push(`body to the heavy beat, mesmerizing ${his} neighbors on the floor.`);
			} else if (eventSlave.skill.entertainment > 30) {
				r.push(`skillfully moving ${his}`);
				if (eventSlave.belly >= 1500) {
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`gravid`);
					} else {
						r.push(`rounded`);
					}
				}
				r.push(`body to the heavy beat, drawing a lustful gaze or two.`);
			} else {
				r.push(`clumsily moving`);
				if (eventSlave.belly >= 1500) {
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`gravid`);
					} else {
						r.push(`rounded`);
					}
				}
				r.push(`${his} body to the heavy beat, attracting little notice among the press of novices.`);
			}
			r.push(`It doesn't take long for ${him} to back ${himself} into you so ${he} can grind; ${he} cranes ${his} neck back to plant an <span class="devotion inc">earnest kiss</span> on your chin.`);
			eventSlave.devotion += 4;
			return r;
		}

		function sporting() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen; you tell ${him} ${he}'ll be spending the day with you at a game outside the arcology, and ${he}'s to meet you at your VTOL pad in two hours. ${He} ponders for a moment but clearly understands this is related to ${his} age, somehow. Right at the proper time, ${he} arrives on the pad. ${He}'s clearly spent the whole time getting the right clothing; somehow ${he} used the clothing inventory system to find a cheerleader uniform from the home team. It's one size too small, though you're unsure whether this is intentional or not. The hem of the pleated cheerleader skirt is barely low enough to conceal ${his}`);
			if (eventSlave.dick > 0) {
				r.push(`dick,`);
			} else if (eventSlave.vagina === -1) {
				r.push(`lack of private parts,`);
			} else {
				r.push(`pussy,`);
			}
			r.push(`and ${he} bounces a little on ${his} heels for you to show off how ${he}'s going commando underneath it. ${His}`);
			if (eventSlave.belly >= 100000) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
			} else if (eventSlave.weight > 130) {
				r.push(`hugely soft`);
			} else if (eventSlave.belly >= 1500) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
			} else if (eventSlave.muscles > 30) {
				r.push(`ripped`);
			} else if (eventSlave.weight > 30) {
				r.push(`fat`);
			} else if (eventSlave.weight > 10) {
				r.push(`plush`);
			} else {
				r.push(`taut`);
			}
			r.push(`midriff is bare. The top`);
			if (eventSlave.boobs > 2000) {
				r.push(`somehow contains ${his} tits, with the team's logo at least`);
				if (V.showInches === 2) {
					r.push(`three feet`);
				} else {
					r.push(`a meter`);
				}
				r.push(`wide across ${his} chest.`);
			} else if (eventSlave.boobs > 1000) {
				r.push(`is a great location for the team's logo, since ${his} tits allow it to be quite large.`);
			} else if (eventSlave.boobs > 300) {
				r.push(`is a good location for the team's logo, since ${his} tits allow it to be pretty big.`);
			} else {
				r.push(`flatters ${his} flat chest, especially with the team logo over it.`);
			}
			r.push(`${He} even found a pair of appropriately colored pom-poms somewhere. The implicit message about age was understood; ${he}'s made up to look even younger.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`You have a front-row seat, of course, and ${he} excitedly takes ${his} place beside you,`);
			if (eventSlave.butt > 12) {
				r.push(`thankful that you reserved a seat for both of ${his} massive cheeks.`);
			} else if (eventSlave.belly >= 300000) {
				r.push(`thankful that the front row has plenty of room for ${his} ${belly} belly to occupy.`);
			} else if (eventSlave.butt > 6) {
				r.push(`carefully fitting ${his} big bottom into the seat.`);
			} else if (eventSlave.boobs > 4000) {
				r.push(`${his} absurd boobs rubbing against your arm.`);
			}
			r.push(`${He} cheers lustily at all the right moments, earning repeated crowd focus shots on the big screen; many fans wonder who their ridiculously hot fellow fan is before recognizing you, putting two and two together, and realizing enviously that ${he}'s your sex slave. Since this is the Free Cities, the big screen gives ${him} more attention rather than cutting away when ${he} intentionally cheers hard enough that ${his} skirt rides up.`);
			if (eventSlave.broodmother === 2 && eventSlave.preg >= 36) {
				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, facing away from the game and goes into labor on another of ${his} brood; the contractions forcing ${him} to lean forward onto ${his} ${belly} stomach and give the players below a clear view of ${his} crowning child.`);
			} else if (eventSlave.belly < 300000) {
				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, facing away from the game and bending down to show cleavage to the stands in such a way that ${his}`);
				if (eventSlave.butt > 5) {
					r.push(`massive ass`);
				} else if (eventSlave.butt > 2) {
					r.push(`big butt`);
				} else {
					r.push(`nice ass`);
				}
				r.push(`lifts ${his} skirt up enough that the players below can clearly see ${his}`);
				if (eventSlave.anus > 2) {
					r.push(`big slit of an asspussy`);
				} else if (eventSlave.anus > 1) {
					r.push(`nice asspussy`);
				} else if (eventSlave.anus > 0) {
					r.push(`tight asshole`);
				} else {
					r.push(`virgin asshole`);
				}
				if (eventSlave.vagina > 3) {
					r.push(`and gaping pussy`);
				} else if (eventSlave.vagina > 2) {
					r.push(`and used pussy`);
				} else if (eventSlave.vagina > 1) {
					r.push(`and lovely pussy`);
				} else if (eventSlave.vagina > 0) {
					r.push(`and tight pussy`);
				} else if (eventSlave.vagina === 0) {
					r.push(`and virgin pussy`);
				}
				r.push(r.pop() + `.`);
			} else {
				r.push(`The only slightly embarrassing incident is when ${he}'s standing up to rally the crowd behind ${him}, cheering while swinging ${his} absurd belly back and forth and accidentally smashes into a concession vendor, sending them to the floor. ${His} efforts to help him up forces ${him} to stand in such a way that ${his}`);
				if (eventSlave.butt > 5) {
					r.push(`massive ass`);
				} else if (eventSlave.butt > 2) {
					r.push(`big butt`);
				} else {
					r.push(`nice ass`);
				}
				r.push(`lifts ${his} skirt up enough that the players below can clearly see ${his}`);
				if (eventSlave.anus > 2) {
					r.push(`big slit of an asspussy`);
				} else if (eventSlave.anus > 1) {
					r.push(`nice asspussy`);
				} else if (eventSlave.anus > 0) {
					r.push(`tight asshole`);
				} else {
					r.push(`virgin asshole`);
				}
				if (eventSlave.vagina > 3) {
					r.push(`and gaping pussy`);
				} else if (eventSlave.vagina > 2) {
					r.push(`and used pussy`);
				} else if (eventSlave.vagina > 1) {
					r.push(`and lovely pussy`);
				} else if (eventSlave.vagina > 0) {
					r.push(`and tight pussy`);
				} else if (eventSlave.vagina === 0) {
					r.push(`and virgin pussy`);
				}
				r.push(r.pop() + `.`);
			}
			r.push(`A player from the visiting team is distracted enough to blow a play. Any fans who might have been inclined to disapprove forget their objections when the home team capitalizes on the mistake to score.`);
			repX(500, "event", eventSlave);
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function old() {
			let didVaginal = false;
			let didAnal = false;
			r = [];
			r.push(`You call out to stop ${him}, and ${he} turns obediently to listen. You tell ${him} you're interested to see if ${his} old body can still perform. Something about the way you say 'old' makes ${him} flinch, and ${he}'s right to worry. You tell ${him} to go out and make you ${cashFormat(200)}, and to hurry back if ${he} wants to avoid punishment. ${He} hesitates for an instant before hurrying outside. A few hours later you check on ${him} remotely. The feed shows ${him}`);
			if (eventSlave.belly >= 10000) {
				r.push(`waddle`);
			} else {
				r.push(`walk`);
			}
			r.push(`quickly up to a couple out on the street; you can't hear what's said, but ${he}`);
			if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
				r.push(`turns around to rub ${his} bare butt against the crotch of the man's pants. He pulls them down and fucks ${him} right there`);
				if (canDoVaginal(eventSlave) && eventSlave.vagina === 0) {
					r.push(`<span class="virginity loss">taking ${his} virginity,</span>`);
					didVaginal = true;
				} else if (canDoAnal(eventSlave) && eventSlave.anus === 0) {
					r.push(`<span class="virginity loss">taking ${his} anal virginity,</span>`);
					didAnal = true;
				}
				r.push(`as the woman`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`pulls and abuses`);
				} else {
					r.push(`roughly fingers`);
				}
				r.push(`${his} poor nipples. Boring of this, he switches to torturing the poor slave's`);
				if (eventSlave.dick > 0) {
					r.push(`dick,`);
				} else if (eventSlave.vagina === -1) {
					r.push(`butthole,`);
				} else {
					r.push(`pussy,`);
				}
				r.push(`slapping ${him} until ${he} cries and then making out with the weeping whore. Much later, ${eventSlave.slaveName} limps tiredly into your office and gives you your  ${cashFormat(200)}. You ask ${him} how ${he}'s feeling, and ${he} mumbles,`,
					Spoken(eventSlave, `"I'm OK, ${Master}. Holes are pretty sore though. Kinda loose."`)
				);
			} else {
				r.push(`drops to ${his} ${hasBothLegs(eventSlave) ? "knees" : "knee"} to nuzzle against the man's pants. He pulls them down and facefucks ${him} right there, as the woman`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`pulls and abuses`);
				} else {
					r.push(`roughly fingers`);
				}
				r.push(`${his} poor nipples. Boring of this, ${he} switches to torturing the poor slave's`);
				if (eventSlave.dick > 0) {
					r.push(`dick,`);
				} else if (eventSlave.vagina === -1) {
					r.push(`butthole,`);
				} else {
					r.push(`pussy,`);
				}
				r.push(`slapping ${him} until ${he} cries and then making out with the weeping whore. Much later, ${eventSlave.slaveName} limps tiredly into your office and gives you your ${cashFormat(200)}. You ask ${him} how ${he}'s feeling, and ${he} mumbles,`,
					Spoken(eventSlave, `"I'm OK, ${Master}. My jaw kinda hurts and my legs are really sore."`)
				);
			}
			r.push(`You tell ${him} that's of little concern, since ${he} has relatively few years of use left: you may as well extract what value you can from ${him}. ${He}'s too exhausted to hide ${his} response, and collapses, sobbing.`);
			cashX(200, "event", eventSlave);
			eventSlave.trust -= 5;
			if (didAnal) {
				eventSlave.anus++;
				seX(eventSlave, "anal", "public", "penetrative");
				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
					r.push(knockMeUp(eventSlave, 10, 1, -2));
				}
			} else if (didVaginal) {
				eventSlave.vagina++;
				seX(eventSlave, "vaginal", "public", "penetrative");
				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
					r.push(knockMeUp(eventSlave, 10, 0, -2));
				}
			} else if (canDoVaginal(eventSlave)) {
				seX(eventSlave, "vaginal", "public", "penetrative");
				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
					r.push(knockMeUp(eventSlave, 10, 0, -2));
				}
			} else if (canDoAnal(eventSlave)) {
				seX(eventSlave, "anal", "public", "penetrative");
				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
					r.push(knockMeUp(eventSlave, 10, 1, -2));
				}
			} else {
				seX(eventSlave, "oral", "public", "penetrative");
			}
			return r;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				s => s.devotion > 20,
				s => s.assignment !== Job.QUARTER,
				isAmputee,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const belly = bellyAdjective(eventSlave);

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(`Lying on the couch next to your desk as you work is`);
		r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), ","));
		r.push(`looking like the neglected`);
		if (eventSlave.belly >= 600000) {
			if (eventSlave.bellyPreg > 0) {
				r.push(`baby-filled womb`);
			} else {
				r.push(`overinflated sex toy`);
			}
		} else if (eventSlave.belly >= 5000) {
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnant`);
			} else if (eventSlave.bellyImplant >= 3000) {
				r.push(`blow-up`);
			} else {
				r.push(`${eventSlave.inflationType}-filled`);
			}
			r.push(`sex toy`);
		} else {
			r.push(`little sex toy`);
		}
		r.push(`that ${he} is. You've been busy and haven't used ${him} for a while, and since ${he}'s accepted ${his} place as a helpless living fucktoy, ${he}'s gotten quite aroused with nothing to do but lie there and watch ${his} ${getWrittenTitle(eventSlave)} work. It's not like ${he} can touch ${himself} any more.`);
		if (eventSlave.chastityPenis === 1) {
			r.push(`${His} caged cock reduces ${him} to a set of holes in a limbless torso.`);
		} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
			r.push(`${His} penis hangs limp and useless from ${his} limbless torso.`);
		} else if (eventSlave.dick >= 5) {
			r.push(`${His} huge erection pokes out from ${his} limbless torso, ${his} only remaining appendage.`);
		} else if (eventSlave.dick > 2) {
			r.push(`${His} still-proud erection pokes out from ${his} limbless torso.`);
		} else if (eventSlave.dick > 0) {
			r.push(`${His} pathetic little erection pokes out from ${his} limbless torso.`);
		} else if (eventSlave.clit > 0) {
			r.push(`${His} engorged clit juts out from ${his} legless hips.`);
		} else if (eventSlave.vagina === -1) {
			if (canDoAnal(eventSlave)) {
				r.push(`${His} asspussy is on total display, unobscured by thighs.`);
			} else {
				r.push(`${His} anal chastity is on total display, unobscured by thighs.`);
			}
		} else {
			if (canDoVaginal(eventSlave)) {
				r.push(`${His} moist pussy is on total display, unobscured by thighs.`);
			} else {
				r.push(`${His} vaginal chastity is on total display, unobscured by thighs.`);
			}
		}
		if (eventSlave.belly >= 10000) {
			r.push(`${His}`);
			if (eventSlave.bellyPreg >= 8000) {
				r.push(`advanced pregnancy`);
			} else {
				r.push(`greatly distended belly`);
			}
			r.push(`gives ${him} a comically rounded appearance.`);
		}
		if (eventSlave.boobs > 4000) {
			r.push(`${He}'s almost smothered by ${his} gigantic breasts as ${he} lies there; ${his} remaining body is almost half breasts.`);
		}
		App.Events.addParagraph(node, r);

		let choices = [];
		if (eventSlave.belly < 1500 && (canDoAnal(eventSlave) || canDoVaginal(eventSlave))) {
			choices.push(new App.Events.Result(`Carry ${him} over to your work`, work, virginityCheck()));
		}
		if ((V.PC.dick !== 0) && (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) && V.PC.belly < 100) {
			choices.push(new App.Events.Result(`Carry ${him} outside`, outside, virginityCheck()));
		}
		choices.push(new App.Events.Result(`See how high ${his} arousal will go`, high));
		App.Events.addResponses(node, choices);

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

		function work() {
			const {
				hisP, heP, himP
			} = getPronouns(V.PC).appendSuffix("P");
			r = [];
			r.push(`Since you're so busy, you find a way of working and seeing to your sex toy both. You scoop ${him} up, eliciting whimpers of joy at the impending relief,`);
			if (V.PC.dick === 0) {
				r.push(`and move over to the couch so you can work lying down. You sit ${him} on top of you, reversed so ${his} head is between your legs for a little oral service, and slide a dildo`);
				if (canDoVaginal(eventSlave)) {
					r.push(`into ${his} pussy so you can tease ${him} at leisure when you have a spare moment.`);
					r.push(VCheck.Vaginal(eventSlave, 1));
				} else {
					r.push(`up ${his} butt so you can sodomize ${him} at leisure when you have a spare moment.`);
					r.push(VCheck.Anal(eventSlave, 1));
				}
			} else {
				r.push(`and sit back down at your desk. You slide ${him} onto your erect member and carefully secure ${him} with a few straps so ${he} can serve as your living cocksleeve as you see to your business.`);
			}
			r.push(`There isn't much thrusting as you continue with your affairs, but ${he}'s so horny ${he} doesn't need it. ${He} has become more submissive to you. There's no telling what the day's faceless business interlocutors would think if they knew the person on the other side of their communications had`);
			if (V.PC.dick === 0) {
				r.push(`a limbless slave gently sucking ${hisP} clit while they spoke with ${himP}.`);
			} else {
				r.push(`${hisP} cock inside a limbless slave as ${heP} dealt with them.`);
			}
			eventSlave.devotion += 4;
			return r;
		}

		function outside(){
			r = [];
			if (eventSlave.belly >= 600000) {
				r.push(`You struggle to heft ${his} overfilled body up, eliciting whimpers of joy at the impending relief and the pressure removed from ${his} body, and carefully secure ${him} with a few straps so ${he} can serve as your living cocksleeve. ${He}'s attached to the front of your torso`);
				if (eventSlave.belly >= 5000) {
					r.push(r.pop() + ",");
					r.push(`${his} ${belly}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnancy`);
					} else {
						r.push(`stomach`);
					}
					r.push(`forcing you to experience what it is like to carry ${eventSlave.pregType} children,`);
				}
				r.push(`with your cock up inside ${him}, and the gentle motion of your member as you waddle outside brings ${him} to climax within a few steps. You carefully stroll around the nicer levels of the arcology, admiring the views and`);
				if (canSee(eventSlave)) {
					r.push(`showing ${eventSlave.slaveName} the sights ${he} now requires assistance to see`);
				} else if (canHear(eventSlave)) {
					r.push(`explaining the sights as ${eventSlave.slaveName} soaks in the sounds`);
					if (canSmell(eventSlave)) {
						r.push(`and smells`);
					}
					r.push(`${he} now requires assistance to experience`);
				} else {
					r.push(`explaining everything around ${him} as ${he} basks in the feeling of the fresh air on ${his} ${eventSlave.skin} skin`);
				}
				r.push(`and leaving a large wake as people make room for your gravid mass. ${He} has become more devoted to you. The sight of you waddling around with a living fucktoy on your cock certainly cements your reputation as an arcology owner who has everything, once they figure out that the belly attached to you is, in fact, owned by a barely visible slave${girl}.`);
			} else if (eventSlave.belly >= 300000) {
				r.push(`You heft ${his} heavy body up, eliciting whimpers of joy at the impending relief, and carefully secure ${him} with a few straps so ${he} can serve as your living cocksleeve. ${He}'s attached to the front of your torso`);
				if (eventSlave.belly >= 5000) {
					r.push(r.pop() + ",");
					r.push(`${his} ${belly}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnancy`);
					} else {
						r.push(`stomach`);
					}
					r.push(`massively jutting out in front of you,`);
				}
				r.push(`with your cock up inside ${him}, and the gentle motion of your member as you waddle outside brings ${him} to climax within a few steps. You carefully stroll around the nicer levels of the arcology, admiring the views and`);
				if (canSee(eventSlave)) {
					r.push(`showing ${eventSlave.slaveName} the sights ${he} now requires assistance to see.`);
				} else if (canHear(eventSlave)) {
					r.push(`explaining the sights as ${eventSlave.slaveName} soaks in the sounds`);
					if (canSmell(eventSlave)) {
						r.push(`and smells`);
					}
					r.push(`${he} now requires assistance to experience.`);
				} else {
					r.push(`explaining everything around ${him} as ${he} basks in the feeling of the fresh air on ${his} ${eventSlave.skin} skin.`);
				}
				r.push(`${He} has become more devoted to you. The sight of you waddling around with a living fucktoy on your cock certainly cements your reputation as an arcology owner who has everything.`);
			} else {
				r.push(`You scoop ${him} up, eliciting whimpers of joy at the impending relief, and carefully secure ${him} with a few straps so ${he} can serve as your living cocksleeve. ${He}'s attached to the front of your torso`);
				if (eventSlave.belly >= 5000) {
					r.push(r.pop() + ",");
					r.push(`${his} ${belly}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnancy`);
					} else {
						r.push(`stomach`);
					}
					r.push(`jutting out in front of you,`);
				}
				r.push(`with your cock up inside ${him}, and the gentle motion of your member as you walk outside brings ${him} to climax within a few steps. You take your time and stroll around the nicer levels of the arcology, admiring the views and`);
				if (canSee(eventSlave)) {
					r.push(`showing ${eventSlave.slaveName} the sights ${he} now requires assistance to see.`);
				} else if (canHear(eventSlave)) {
					r.push(`explaining the sights as ${eventSlave.slaveName} soaks in the sounds`);
					if (canSmell(eventSlave)) {
						r.push(`and smells`);
					}
					r.push(`${he} now requires assistance to experience.`);
				} else {
					r.push(`explaining everything around ${him} as ${he} basks in the feeling of the fresh air on ${his} ${eventSlave.skin} skin.`);
				}
				r.push(`${He} has become more devoted to you. The sight of you walking around with a living fucktoy on your cock certainly cements your reputation as an arcology owner who has everything.`);
			}
			eventSlave.devotion += 4;
			repX(500, "event", eventSlave);
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			return r;
		}

		function high(){
			const inch = V.showInches === 2 ? "inch" : "centimeter";
			r = [];
			r.push(`You scoop ${him} up, eliciting whimpers of joy at the impending relief. ${He} moans with disappointment, however, to find ${himself} laid unceremoniously across your desk as you return to your work. You surreptitiously set your desk to monitor ${his} vital signs and gauge ${his} closeness to orgasm. Whenever you can do so without tipping ${his} over, you gently run your fingers across a helpless nipple, across ${his}`);
			if (eventSlave.vagina === -1) {
				r.push(`groin,`);
			} else {
				r.push(`moist lips,`);
			}
			if (eventSlave.belly >= 10000) {
				r.push(`around the edge of ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				}
			} else if (eventSlave.belly >= 1500) {
				r.push(`over the peak of ${his}`);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
			}
			r.push(`belly, or along ${his} surgical scars.`);
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				r.push(`After so much of this that ${he}'s clearly ready to orgasm at the slightest further touch, you gently massage ${his} nether lips with a single finger and ${he} comes spastically, abdominal muscles quivering. ${His} pussy relaxes and opens naturally; taking the cue, you pick ${him} up and lower ${him}, ${inch} by moaning ${inch}, onto`);
				if (V.PC.dick === 0) {
					r.push(`a strap-on you put on while playing with ${his}.`);
				} else {
					r.push(`your cock.`);
				}
				r.push(VCheck.Vaginal(eventSlave, 1));
				r.push(`After pumping ${his} helpless torso up and down with your arms, a parody of masturbation with ${his} helpless body,`);
			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
				r.push(`After so much of this that ${he}'s clearly ready to orgasm at the slightest further touch, you gently massage ${his} anus with a single finger and ${he} comes spastically, abdominal muscles quivering. ${His} sphincter relaxes and opens naturally; taking the cue, you pick ${him} up and lower ${his} rectum, ${inch} by sobbing ${inch}, onto`);
				if (V.PC.dick === 0) {
					r.push(`a strap-on you put on while playing with ${his}.`);
				} else {
					r.push(`your cock.`);
				}
				r.push(VCheck.Anal(eventSlave, 1));
				r.push(`After pumping ${his} helpless torso up and down with your arms, a parody of masturbation with ${his} helpless body,`);
			} else {
				r.push(`After so much of this that ${he}'s clearly ready to orgasm at the slightest further touch, you grab ${his}`);
				if (eventSlave.boobs > 8000) {
					r.push(`massive tits`);
				} else if ((eventSlave.boobsImplant/eventSlave.boobs) >= .60) {
					r.push(`fake tits`);
				} else if (eventSlave.boobs > 2000) {
					r.push(`huge boobs`);
				} else if (eventSlave.boobs > 400) {
					r.push(`boobs`);
				} else {
					r.push(`petite chest`);
				}
				r.push(`and ${he} comes spastically, soaking ${himself} and your desk with fluids. Once you tire of vigorously groping ${him},`);
			}
			r.push(`you carry your toy to the shower to wash ${him}. <span class="trust inc">${He} has become more trusting of you.</span>`);
			eventSlave.trust += 4;
			return r;
		}
	}
};

repo_name: Arkerthan/fc

license: mit


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.assignment !== Job.QUARTER,
				s => s.physicalAge > 35,
				s => s.rules.speech !== "restrictive",
				s => [Job.PUBLIC, Job.WHORE].includes(s.assignment),
				s => s.devotion >= -20,
				s => s.devotion <= 95,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master, say} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);

		App.Events.drawEventArt(node, eventSlave, "no clothing");

		const r = new SpacedTextAccumulator(node);
		r.push(`Passing by the kitchen in the morning, you take a moment to listen to the low hum of your slaves chatting as they`);
		if (V.cockFeeder !== 0) {
			r.push(`wait their turn at the phallic feeders.`);
		} else {
			r.push(`drink their breakfasts.`);
		}
		r.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		r.push(`is nearest the door, and you overhear ${his}`);
		if (eventSlave.voice === 1) {
			r.push(`low`);
		} else if (eventSlave.voice === 2) {
			r.push(`pretty`);
		} else {
			r.push(`high`);
		}
		r.push(
			`voice clearly as ${he} expresses confusion to another slave.`,
			Spoken(eventSlave, `"I don't understand it,"`),
			`${he} ${say}s.`,
			Spoken(eventSlave, `"Why are so many men interested in an old slave like me? I never got this much attention when I was free! Now`)
		);
		if (eventSlave.assignment === Job.WHORE || eventSlave.assignment === Job.BROTHEL) {
			r.push(Spoken(eventSlave, `guys line up to pay to fuck me!"`));
		} else {
			r.push(Spoken(eventSlave, `every guy I approach wants to fuck me!"`));
		}
		r.toParagraph();
		if (FutureSocieties.isActive('FSMaturityPreferentialist')) {
			r.push(`"It's different here," the other slave explains. "Almost everyone here has a thing for older ${V.seeDicks < 100 ? "women. MILFs" : "men. DILFs"} get all the attention."`); // review seeDicks here
		} else if (FutureSocieties.isActive('FSGenderRadicalist') && (eventSlave.dick > 0 || eventSlave.vagina === -1)) {
			if (eventSlave.vagina > -1) {
				r.push(`"Well, you're a futa," the other slave explains. "A chick with a dick. Everyone here is going to want to fuck you, since you've got both."`);
			} else if (eventSlave.balls > 0) {
				r.push(`"Well, I bet you cum when they fuck you," the other slave explains. "They love it when you do that here."`);
			} else if (eventSlave.dick === 0) {
				r.push(`"You've got nothing in front," the other slave explains. "That's like an advertisement that your ass is public, here."`);
			} else {
				r.push(`"You've got a soft girldick," the other slave explains. "That's like an advertisement that you love it up the butt, here."`);
			}
		} else if (FutureSocieties.isActive('FSAssetExpansionist') && eventSlave.boobs > 4000) {
			r.push(`"It's your boobs," the other slave explains. "There's no such thing as too big, here. Everyone who sees your boobs here is going to want to fuck you."`);
		} else if (FutureSocieties.isActive('FSAssetExpansionist') && eventSlave.butt > 7) {
			r.push(`"It's your ass," the other slave explains. "There's no such thing as too big, here. Everyone who sees your ass here is going to want to fuck you."`);
		} else if ((FutureSocieties.isActive('FSRepopulationFocus')) && eventSlave.belly >= 5000) {
			r.push(`"It's your belly," the other slave explains. "They love how big and round it is. If you look pregnant, they'll be all over you. Even if it's fake, they won't care."`);
		} else if (V.arcologies[0].FSRepopulationFocusPregPolicy === 1 && eventSlave.bellyPreg >= 5000) {
			r.push(`"It's your belly," the other slave explains. "Preggos are in these days and you aren't exactly lacking in the 'with child' department."`);
		} else if (FutureSocieties.isActive('FSPastoralist') && eventSlave.boobs >= 800 && eventSlave.lactation > 0 && eventSlave.lactationAdaptation > 50) {
			r.push(`"It's those plump, milky titties you have," the other slave explains. "Everyone here is thirsty for a motherly body like yours, in more ways than one."`);
		} else if ((FutureSocieties.isActive('FSTransformationFetishist') && eventSlave.boobsImplant/eventSlave.boobs) >= .50) {
			r.push(`"It's your fake tits," the other slave explains. "They love how fake they look, here. If you look like a bimbo, they don't care if you're a little mature."`);
		} else if (FutureSocieties.isActive('FSHedonisticDecadence') && eventSlave.weight > 95) {
			r.push(`"You're so fat," the other slave explains. "Everyone here loves thick ${girl}s. They don't care that you're a little mature; that just means you understand life's pleasures more."`);
		} else if (FutureSocieties.isActive('FSPhysicalIdealist') && eventSlave.muscles > 50) {
			r.push(`"It's how ripped you are," the other slave explains. "It promises you won't give out after one fuck, no matter how old you are."`);
		} else if (FutureSocieties.isActive('FSSlimnessEnthusiast') && eventSlave.boobs < 800 && eventSlave.butt < 3) {
			r.push(`"You're so slim," the other slave explains. "Everyone here loves slender ${girl}s. They don't care that you're a little mature; they think you're hot."`);
		} else if (FutureSocieties.isActive('FSStatuesqueGlorification') && heightPass(eventSlave)) {
			r.push(`"You're really fucking tall," the other slave explains. "Guys here love a ${girl} that tower over them and you're, like, the definition of tall."`);
		} else if (FutureSocieties.isActive('FSPetiteAdmiration') && heightPass(eventSlave)) {
			r.push(`"You're so small," the other slave explains. "A guy can just scoop you up and carry you off for a good time."`);
		} else if (FutureSocieties.isActive('FSBodyPurist') && eventSlave.boobsImplant === 0 && eventSlave.health.condition > 50) {
			r.push(`"It's how healthy you are, and your natural boobs," the other slave explains. "You look good and natural, and everyone likes that here, especially if you're mature."`);
		} else if ((FutureSocieties.isActive('FSIntellectualDependency')) && bimboScore(eventSlave) >= 6) {
			r.push(`"You're so hot," the other slave explains. "Guys love a ${girl} who knows a good time and your body screams 'ravish me'."`);
		} else if (eventSlave.face > 95) {
			r.push(`"It might have something to do with how incredibly beautiful you are," the other slave explains sarcastically. "Come on, you could be a model. Of course they want you."`);
		} else if (eventSlave.boobs > 4000) {
			r.push(`"It might have something to do with the fact that your tits are bigger than your head," the other slave explains sarcastically. "You look like a teenager's wet dream."`);
		} else if (eventSlave.butt > 7) {
			r.push(`"It might have something to do with that outrageous caboose you have," the other slave explains sarcastically. "You look like an ass man's wet dream."`);
		} else if (eventSlave.face > 10) {
			r.push(`"You're very pretty," the other slave explains reassuringly. "Come on, you are. It's not surprising that guys want you."`);
		} else {
			r.push(`"Is it really that surprising?" the other slave asks rhetorically. "Guys like sex. You're sex. Why shouldn't they like you? I bet fucking you feels great."`);
		}
		r.push(`There's a pause, and then the other slave continues in a more serious tone, asking, "You're not, like, unhappy with that, are you? It's really good for a slave to be in demand, you know."`);
		r.toParagraph();
		r.push(
			Spoken(eventSlave, `"Oh no, I didn't mean it like that,"`),
			`replies ${eventSlave.slaveName} hurriedly.`
		);
		if (eventSlave.energy > 80) {
			r.push(Spoken(eventSlave, `"I'm so horny all the time, it's good. I'd probably go crazy if I didn't get that much attention. Whenever anyone's done with me I can't wait for the next.`));
		} else if (eventSlave.fetish === "humiliation") {
			r.push(Spoken(eventSlave, `"It's embarrassing, but I, um, really like being so popular in public, um, like that. Where everyone can see.`));
		} else if (eventSlave.devotion > 50) {
			r.push(Spoken(eventSlave, `"I really want to do well, and it feels good that I'm able to help.`));
		} else if (eventSlave.devotion > 20) {
			r.push(Spoken(eventSlave, `"I, um, know I have to. And it's not bad, I mean, it's okay.`));
		} else {
			r.push(Spoken(eventSlave, `"I know it means I'm worth something. It's reassuring, and I remind myself of it whenever I get scared about being a slave, you know.`));
		}
		r.push(
			Spoken(eventSlave, `I didn't mean to sound conceited, either. I guess I'm still getting used to life here, that's all. Sometimes I think like I'm not, um, here, and I'm surprised so many people want me. It's kind of nice, actually,"`),
			`${he} ${say}s with some self-confidence.`
		);
		if (eventSlave.fetish === "humiliation" && eventSlave.fetishKnown === 0) {
			r.push(`It sounds like ${he} has a <span class="fetish gain">humiliation fetish!</span>`);
			eventSlave.fetishKnown = 1;
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Praise ${his} outlook`, praise),
			new App.Events.Result(`Let ${him} know you think ${he}'s attractive, too`, attractive, virginityWarning()),
		]);

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

		function praise() {
			const r = new SpacedTextAccumulator();
			r.push(`You speak from where you are, and without preamble, startling both slaves badly. Doing their best to recover, they listen as you tell ${eventSlave.slaveName} that ${he} has a good, praiseworthy outlook on life as a sex slave.`);
			if (eventSlave.energy > 80) {
				r.push(`${His} extreme appetite for sex will serve ${him} well. It's important to love what you do, and if ${he} wakes up every morning wanting to get fucked, ${he}'ll enjoy ${his} life as a`);
				if (eventSlave.assignment === Job.WHORE || eventSlave.assignment === Job.BROTHEL) {
					r.push(`slave prostitute.`);
				} else {
					r.push(`public slut.`);
				}
			} else if (eventSlave.fetish === "humiliation") {
				r.push(`${He} should feel lucky to have a fetish for public use. It's important to love what you do, and if being openly passed around gets ${him} off, ${he}'ll enjoy ${his} life as a`);
				if (eventSlave.assignment === Job.WHORE || eventSlave.assignment === Job.BROTHEL) {
					r.push(`slave prostitute.`);
				} else {
					r.push(`public slut.`);
				}
			} else if (eventSlave.devotion > 50) {
				r.push(`It's great that ${he}'s internalized ${his} role, and wants to do well. As long as ${he} wants to perform well and applies ${himself}, you're confident that ${he}'ll continue to improve and become a better and more valuable slave.`);
			} else if (eventSlave.devotion > 20) {
				r.push(`${His} obedience is commendable. You understand that ${he} struggles with ${his} life as an involuntary sex object at times. ${He}'ll learn to do better, and as ${he} improves, ${he}'ll be all right as long as ${he} obeys you and does ${his} best.`);
			} else {
				r.push(`To describe ${his} situation bluntly, the best possible approach for ${him} is to obey you and do ${his} best. There's not really any possible outcome in which slaves can lose out by doing their best to be useful and valuable. It's in ${his} interest to do ${his} best.`);
			}
			r.push(
				Spoken(eventSlave, `"Yes, ${Master},"`),
				`they chorus automatically. You turn and go. ${eventSlave.slaveName} is taken a bit aback by your apparent omnipresence in the penthouse, but reminds ${himself} that your guidance seemed straightforward and genuine. ${He}'s confirmed in ${his} understanding of what it means to be a good ${SlaveTitle(eventSlave)}.`
			);
			eventSlave.trust += 5;
			r.toParagraph();
			return r.container();
		}

		function attractive() {
			const r = new SpacedTextAccumulator();
			const {himU, heU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');
			r.push(`The slaves continue their gossip until ${eventSlave.slaveName} feels a pair of`);
			if (V.PC.title === 1) {
				r.push(`strong`);
			} else {
				r.push(`firm, feminine`);
			}
			r.push(`hands grip the sides of ${his}`);
			if (eventSlave.belly >= 150000) {
				r.push(`${belly} distended`);
			} else if (eventSlave.weight > 95) {
				r.push(`fat`);
			} else if (eventSlave.belly >= 5000) {
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy-swollen`);
				} else if (eventSlave.bellyImplant >= 3000) {
					r.push(`implant-swollen`);
				} else {
					r.push(`${eventSlave.inflationType}-bloated`);
				}
			} else if (eventSlave.weight > 30) {
				r.push(`pudgy`);
			} else if (eventSlave.waist < -95) {
				r.push(`cartoonishly narrow`);
			} else if (eventSlave.muscles > 30) {
				r.push(`ripped`);
			} else if (eventSlave.waist < -10) {
				r.push(`wasp`);
			} else if (eventSlave.weight > 10) {
				r.push(`soft`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else if (eventSlave.weight >= -10) {
				r.push(`trim`);
			} else {
				r.push(`skinny`);
			}
			r.push(`waist. ${He} starts but doesn't try to turn, and shivers as you run your hands up`);
			if (eventSlave.weight > 130) {
				r.push(`the thick, soft flesh that pads ${his} ribs`);
			} else if (eventSlave.muscles > 30) {
				r.push(`the muscles that jacket ${his} ribs`);
			} else if (eventSlave.weight > 30) {
				r.push(`the soft flesh that pads ${his} ribs`);
			} else {
				r.push(`${his} ribcage`);
			}
			r.push(`and forward`);
			if (eventSlave.boobs > 3000) {
				r.push(`into the soft, weighty place formed by the overhang of ${his} massive breasts`);
			} else if (eventSlave.boobs > 300) {
				r.push(`to cup ${his} breasts`);
			} else {
				r.push(`to clasp ${him} around the sternum`);
			}
			r.push(`and pull ${him} back into your arms. The other slave watches silently, awaiting some cue as to whether ${heU}'s to join in or return to breakfast; you give ${himU} a flick of your chin, and ${heU} turns away, leaving you with ${eventSlave.slaveName}, embracing among the eating slaves.`);
			r.toParagraph();
			r.push(`You whisper into ${his} ear that you think ${he}'s attractive,`);
			if (V.PC.dick !== 0) {
				r.push(`and point out that ${he} can feel the proof between ${his} buttocks. You're hard, and your stiff prick is poking ${him} in the rear. ${He} gasps and shifts a little, and you nestle your dick even closer into the warm place between ${his} legs and ass.`);
			} else {
				r.push(`and tell ${him} that you can prove it. You grab one of ${his} hands and pull it around behind ${him}, between you, making ${him} feel your pussy. ${He} gasps at how wet it is.`);
			}
			r.push(
				Spoken(eventSlave, `"An old slave like me, ${Master}?"`),
				`${he} echoes in a small voice. An old slave like ${him}, you confirm, and tell ${him} that right now,`
			);
			if (V.PC.dick !== 0 && (canDoVaginal(eventSlave) || canDoAnal(eventSlave))) {
				if (canDoVaginal(eventSlave)) {
					r.push(`you've decided to fuck ${his} pussy. ${He} starts at the sudden vulgarity, even with your cock resting against the soft skin between the bottom of ${his} vulva and ${his} anus, and shudders with sudden pleasure as you use a hand to guide yourself inside ${his} welcoming channel.`);
					r.push(VCheck.Vaginal(eventSlave, 1));
				} else {
					r.push(`${his} ass is yours. ${He} starts at the sudden vulgarity, even though`);
					if (canHear(eventSlave)) {
						r.push(`hearing`);
					} else {
						r.push(`discovering`);
					}
					r.push(`that the cock that's pressing against ${his} butt will be going inside it soon can't be that surprising. ${He} cocks ${his} hips obediently, letting you force your dick up ${his} asshole.`);
					r.push(VCheck.Anal(eventSlave, 1));
				}
				r.push(`You take ${him} standing,`);
			} else {
				r.push(`some oral sex from a slave like ${him} sounds just right. You push ${him} to ${his} knees and`);
				if (V.PC.dick !== 0) {
					r.push(`push your dick into ${his} mouth,`);
				} else {
					r.push(`hold ${his} mouth to your cunt,`);
				}
				r.push(`taking your pleasure from ${him}`);
				seX(eventSlave, "oral", V.PC, "penetrative");
			}
			r.push(`right there among your breakfasting slaves, who try to ignore you or watch with appreciation, according to their own natures. When you're finished, you`);
			if (V.PC.dick !== 0) {
				r.push(`spin ${him} around and kiss ${him},`);
			} else {
				r.push(`pull ${him} up to ${his} feet and kiss ${him}, tasting yourself on ${his} lips and`);
			}
			r.push(`making sure ${he} knows <span class="devotion inc">you appreciate ${his} mature body</span> just as much as`);
			if (eventSlave.assignment === Job.WHORE || eventSlave.assignment === Job.BROTHEL) {
				r.push(`${his} customers do.`);
			} else {
				r.push(`your citizens do.`);
			}
			eventSlave.devotion += 5;
			r.toParagraph();
			return r.container();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				s => s.assignment !== Job.QUARTER,
				s => s.devotion > 20,
				s => s.boobs > 2000,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, hers
		} = getPronouns(eventSlave);
		const {title: Master, say} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const arms = hasBothArms(eventSlave) ? "arms" : "arm";
		const PC = V.PC;

		App.Events.drawEventArt(node, eventSlave, "no clothing");

		const r = new SpacedTextAccumulator(node);
		r.push(
			`You pass through your slaves' living area as some of them are starting their days.`,
			contextualIntro(PC, eventSlave, true, false, true),
			`is one of them, and ${he}'s just`,
		);
		if (eventSlave.rules.living === "spare") {
			r.push(`crawled out of ${his} spartan bedroll.`);
		} else if (eventSlave.rules.living === "normal") {
			r.push(`gotten out of ${his} neat little cot.`);
		} else if (eventSlave.relationship >= 4) {
			const relation = getSlave(eventSlave.relationshipTarget);
			const {his2, girl2, wife2} = getPronouns(relation).appendSuffix("2");
			r.push(`climbed out of bed. (${eventSlave.slaveName}'s`);
			if (eventSlave.relationship === 5) {
				r.push(wife2);
			} else {
				r.push(`${girl2}friend`);
			}
			r.push(`${relation.slaveName} is still asleep in it, and the shape of ${his2}`);
			if (relation.belly >= 120000) {
				r.push(`${belly} belly is`);
			} else if (relation.boobs > 25000) {
				r.push(`immense`);
				if (relation.boobsImplant/relation.boobs >= .60) {
					r.push(`fake`);
				}
				r.push(`breasts are`);
			} else if (relation.dick > 10) {
				r.push(`monster dick is`);
			} else if (relation.balls > 50) {
				r.push(`immense testicles are`);
			} else if (relation.weight > 130) {
				r.push(`gigantic body is`);
			} else if (relation.butt > 12) {
				r.push(`inhuman ass is`);
			} else if (relation.weight > 96) {
				r.push(`fat form is`);
			} else if (relation.hips > 2) {
				r.push(`inhuman hips are`);
			} else if (relation.dick > 6) {
				r.push(`huge soft cock is`);
			} else if (canAchieveErection(relation)) {
				r.push(`half-erect dick is`);
			} else if (relation.belly >= 5000) {
				r.push(`big`);
				if (relation.bellyPreg >= 3000) {
					r.push(`pregnant`);
				}
				r.push(`belly is`);
			} else if (relation.nipples === "huge") {
				r.push(`huge nipples are`);
			} else if (relation.boobs > 5000) {
				r.push(`monstrous`);
				if (relation.boobsImplant/relation.boobs >= .60) {
					r.push(`fake`);
				}
				r.push(`breasts are`);
			} else if (relation.boobs > 2000) {
				r.push(`huge`);
				if (relation.boobsImplant/relation.boobs >= .60) {
					r.push(`fake`);
				}
				r.push(`tits are`);
			} else if (relation.butt > 5) {
				r.push(`monstrous ass is`);
			} else if (relation.balls > 8) {
				r.push(`giant balls are`);
			} else if (relation.weight > 95) {
				r.push(`chubby body is`);
			} else if (relation.muscles > 30) {
				r.push(`muscular body is`);
			} else if (relation.weight > 10) {
				r.push(`chubby belly is`);
			} else if (relation.weight >= -10) {
				r.push(`feminine form is`);
			} else {
				r.push(`thin body is`);
			}
			r.push(`clearly visible under the sheet. They sleep naked, of course.)`);
		} else {
			r.push(`climbed out of ${his} comfortable bed.`);
		}
		r.push(`It's time for ${him} to start another strenuous day of carrying the weight of ${his}`);
		if (eventSlave.boobs > 45000) {
			r.push(`arm-filling`);
		} else if (eventSlave.boobs > 25000) {
			r.push(`back-breaking`);
		} else if (eventSlave.boobs > 10000) {
			r.push(`disproportionate`);
		} else if (eventSlave.boobs > 5000) {
			r.push(`massive`);
		} else {
			r.push(`heavy`);
		}
		if (eventSlave.boobsImplant/eventSlave.boobs >= .60) {
			r.push(`implants.`);
		} else if (eventSlave.lactation) {
			r.push(`milk-bearing udders.`);
		} else if (eventSlave.boobsImplant > 0) {
			r.push(`breasts.`);
		} else {
			r.push(`natural breasts.`);
		}
		r.push(`${He} can manage it`);
		if (eventSlave.muscles <= 10) {
			r.push(`only with difficulty, since ${he}'s not in good shape.`);
		} else if (eventSlave.physicalAge >= 18 && eventSlave.boobs <= 30000+(eventSlave.muscles*100)) {
			r.push(`with ease, since ${he}'s in good shape.`);
		} else if (eventSlave.physicalAge >= 13 && eventSlave.boobs <= 20000+(eventSlave.muscles*50)) {
			r.push(`with ease, since ${he}'s in good shape.`);
		} else if (eventSlave.physicalAge >= 4 && eventSlave.boobs <= 10000+(eventSlave.muscles*20)) {
			r.push(`with ease, since ${he}'s in good shape.`);
		} else if (eventSlave.physicalAge === 3 && eventSlave.boobs <= 5000+(eventSlave.muscles*10)) {
			r.push(`with ease, since ${he}'s in good shape.`);
		} else {
			r.push(`with some difficulty, since they're so big.`);
		}
		r.push(`Slaves with endowments like ${hers} are trained to stretch, and since ${he}'s a good ${SlaveTitle(eventSlave)}, ${he} does it as soon as ${he} gets up. ${He}'s doing it now.`);
		r.toParagraph();
		r.push(`${He} kneels with ${his} legs together, and then sits back, ${his}`);
		if (eventSlave.buttImplant/eventSlave.butt >= .5) {
			r.push(`fake ass not changing shape at all as it rests on ${his} heels.`);
		} else if (eventSlave.butt > 12) {
			r.push(`endless assflesh devouring ${his} legs completely.`);
		} else if (eventSlave.butt > 6) {
			r.push(`mass of assflesh extinguishing ${his} feet completely.`);
		} else if (eventSlave.butt > 2) {
			r.push(`big butt resting heavily on ${his} heels.`);
		} else {
			r.push(`cute butt resting lightly on ${his} heels.`);
		}
		r.push(`Then ${he} reaches ${his} ${arms} back, and leans back, as far as ${he} can go. ${He} arches ${his} spine, closing ${his} eyes voluptuously as ${he} enjoys the stretch in ${his} lower back. The pose thrusts ${his} chest up and out,`);
		if (eventSlave.boobShape === "spherical") {
			r.push(`but ${his} implants stretch ${his} skin so tight that they stay tacked to ${his} chest, right where they are. ${He} looks like a stereotypical silicone queen, arching ${his} back and sticking ${his} fake cans out.`);
		} else if ((eventSlave.boobsImplant/eventSlave.boobs) >= .50) {
			r.push(`making ${his} implant-filled tits stick out even farther than they usually do. ${He} looks like a stereotypical silicone queen, arching ${his} back and sticking ${his} fake cans out.`);
		} else if (eventSlave.boobShape === "perky") {
			r.push(`making ${his} spectacularly perky breasts point their ${eventSlave.nipples} nipples straight up at the ceiling. It's incredible that they've managed to maintain their youthful shape despite their great weight.`);
		} else if (eventSlave.boobShape === "downward-facing") {
			r.push(`showing off the huge area of soft skin above ${his} ${eventSlave.nipples} nipples. Since these face somewhat downward, ${his} swell of bosom above them is a pair of uninterrupted mounds of ${eventSlave.skin} breast.`);
		} else if (eventSlave.boobShape === "torpedo-shaped") {
			r.push(`making ${his} absurd torpedo-shaped tits stick out even farther than they usually do. ${His} ${eventSlave.nipples} nipples point out so far that it's difficult to see how such delectably soft flesh can support its shape.`);
		} else if (eventSlave.boobShape === "wide-set") {
			r.push(`making ${his} wide-set breasts spread even farther, to hang almost to ${his} armpits on either side. It's not conventionally attractive, but ${he}'s certainly very well endowed.`);
		} else if (eventSlave.boobShape === "saggy") {
			r.push(`emphasizing how saggy ${his} tits are. They`);
			if (eventSlave.belly >= 10000) {
				r.push(`rest heavily atop ${his} tautly`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`gravid`);
				} else {
					r.push(`distended`);
				}
				if (eventSlave.belly >= 1500) {
					r.push(belly);
				}
				r.push(`belly.`);
			} else {
				r.push(`hang down far enough to obscure the top of ${his} ${belly} belly.`);
			}
			r.push(`It's not conventionally attractive, but ${he}'s certainly very well endowed.`);
		} else {
			r.push(`making ${his} beautiful breasts stick out nicely. They maintain their perfect shape surprisingly well for being so enormous, and ${his} ${eventSlave.nipples} nipples`);
			if (eventSlave.nipples !== "fuckable") {
				r.push(`stick out at you prominently.`);
			} else {
				r.push(`just beg to be penetrated.`);
			}
		}
		r.push(`${He} sits back up and rubs ${his} hands down`);
		if (eventSlave.belly >= 300000) {
			r.push(`the rear of ${his} swollen sides,`);
		} else {
			r.push(`${his} lower back on either side,`);
		}
		r.push(`sighing contentedly at the feeling.`);
		if (canSee(eventSlave)) {
			r.push(`${He} opens ${his} eyes, and sees you looking at ${him}.`);
		} else {
			r.push(`${His} ears perk up as ${he} notices your presence.`);
		}
		if (eventSlave.energy > 80) {
			if (canTalk(eventSlave)) {
				r.push(Spoken(eventSlave, `"Hi ${Master},"`), `${he} ${say}s flirtatiously,`);
			} else {
				r.push(`${He} waves at you flirtatiously`);
			}
			r.push(`and hugs ${himself} under ${his} boobs, presenting them even more obviously. ${His} strong sex drive is awake, too. ${He}`);
			if (canSee(eventSlave)) {
				r.push(`looks at you speculatively,`);
			} else if (canHear(eventSlave)) {
				r.push(`listens closely,`);
			} else {
				r.push(`waits patiently,`);
			}
			r.push(`obviously hoping to get fucked.`);
		} else if (eventSlave.trust > 20) {
			if (canTalk(eventSlave)) {
				r.push(Spoken(eventSlave, `"Hi ${Master},"`), `${he} ${say}s cutely,`);
			} else {
				r.push(`${He} waves at you cutely`);
			}
			r.push(`and gives ${his} torso a flirty little shake from side to side, making ${his} boobs move interestingly. ${He}`);
			if (canSee(eventSlave)) {
				r.push(`watches you trustingly,`);
			} else {
				r.push(`calmly faces you,`);
			}
			r.push(`obviously wondering if you'd like to enjoy ${his} body.`);
		} else {
			if (canTalk(eventSlave)) {
				r.push(Spoken(eventSlave, `"Good morning, ${Master},"`), `${he} ${say}s properly,`);
			} else {
				r.push(`${He} mutely bows ${his} head towards you, acknowledging your presence and`);
			}
			r.push(`doing ${his} best to be good. ${He}`);
			if (canSee(eventSlave)) {
				r.push(`watches you closely,`);
			} else if (canHear(eventSlave)) {
				r.push(`listens closely,`);
			} else {
				r.push(`waits patiently,`);
			}
			r.push(`ready to obey any command you might give ${him}.`);
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Fuck ${his} boobs`, boobs),
			new App.Events.Result(`Hurt ${him}`, hurt),
			(eventSlave.lactation > 0)
				? new App.Events.Result(`Drink from ${him}`, drink)
				: new App.Events.Result()
		]);

		function boobs() {
			const frag = document.createDocumentFragment();
			const r = new SpacedTextAccumulator(frag);
			r.push(`When ${he}`);
			if (canSee(eventSlave)) {
				r.push(`sees you`);
				if (V.PC.dick !== 0) {
					r.push(`get your dick out,`);
				} else {
					r.push(`approaching ${him} with sapphic lust in your eyes,`);
				}
			} else if (canHear(eventSlave)) {
				r.push(`hears you`);
				if (V.PC.dick !== 0) {
					r.push(`get your dick out,`);
				} else {
					r.push(`hungrily approach,`);
				}
			} else {
				r.push(`feels your fingertips brush against ${his} nipples,`);
			}
			r.push(`${he}`);
			if (eventSlave.energy > 80) {
				r.push(`grins with anticipation,`);
			} else if (eventSlave.trust > 20) {
				r.push(`smiles appealingly,`);
			} else {
				r.push(`does ${his} best to look submissive,`);
			}
			r.push(`and offers you ${his} chest.`);
			if (V.PC.dick !== 0) {
				if (eventSlave.belly >= 300000) {
					r.push(`You have to straddle ${his} ${belly} stomach to get close enough, but ${his} tantalizing breasts are worth the strain.`);
				}
				r.push(`You collect some lubrication for it by sticking your dick in ${his} mouth.`);
				if (eventSlave.skill.oral >= 100) {
					r.push(`${He} swallows you to your base, and is such a skilled cocksucker that ${he} salivates at will, doing ${his} best to get you`);
				} else {
					r.push(`${He} does ${his} best to swallow you as deeply as ${he} can manage, and get your cock`);
				}
				r.push(`nice and slick. You pull your member out of ${his} industriously sucking mouth with a pop, and slide it between ${his} warm breasts. ${He} promptly grabs them and squeezes them together, forming a nice channel for you to fuck. As you start pounding away, ${he} does ${his} best to crane ${his} head down and suckle your dickhead whenever it appears between ${his} boobs, adding more lubrication from ${his} lewdly wet mouth. ${He} knows when you're about to climax, and makes no attempt to avoid it, opening ${his} mouth wide to accept your load. ${He} catches most of it, but your generous ejaculation spatters ${his} face with pearly decoration.`);
			} else {
				r.push(`Deciding to do something a little more intimate than fucking ${his} cleavage with a strap-on, you walk forward and into ${his} face, pressing ${him} inexorably backwards as ${he} nuzzles your pussy until ${he}'s forced to collapse onto the ground. Then you scoot backwards a little, until you're`);
				if (eventSlave.belly >= 10000) {
					r.push(`crammed between ${his} ${belly} middle and breasts.`);
				} else {
					r.push(`straddling ${his} ribcage just below ${his} breasts.`);
				}
				r.push(`${His} huge breasts rest atop your inner thighs,`);
				if (eventSlave.boobsImplant/eventSlave.boobs >= .60) {
					r.push(`${his} skin taut against yours, from the implants.`);
				} else {
					r.push(`heavy and soft and female.`);
				}
				r.push(`You ride ${him} gently like this for a little while, enjoying the feminine weight of ${him} and the effects of this intimacy on ${his} face. Once you're ready for some more stimulation, you pull one of ${his} hands down between ${his} breasts; ${he} gets ${his} thumb down into ${his} cleavage, all the way down until it can stimulate your button and bring you to a soft orgasm. Pleased, you slide down until you're face to face with ${him}, and give ${him} a kiss.`);
			}
			r.push(He);
			if (eventSlave.energy > 80) {
				r.push(`was looking after ${himself} with a hand the whole time, and ${he} <span class="trust inc">smiles gratefully at you</span> with satisfaction.`);
			} else if (eventSlave.trust > 20) {
				r.push(`giggles a little, <span class="trust inc">pleased with ${himself}.</span>`);
			} else {
				r.push(`smiles hesitantly, clearly thinking that <span class="trust inc">${he} did well.</span>`);
			}
			eventSlave.trust += 5;
			r.toParagraph();
			frag.append(App.Events.eventFetish(eventSlave, "boobs"));
			return r.container();
		}

		function hurt() {
			const frag = document.createDocumentFragment();
			const r = new SpacedTextAccumulator(frag);
			r.push(`You decide to exercise a little maliciousness. You take a step forward, producing a look of`);
			if (eventSlave.energy > 80) {
				r.push(`lustful anticipation,`);
			} else if (eventSlave.trust > 20) {
				r.push(`expectation,`);
			} else {
				r.push(`trepidation,`);
			}
			r.push(`but then you stop,`);
			if (canSee(eventSlave)) {
				r.push(`wordlessly gesturing at ${him}`);
			} else if (canHear(eventSlave)) {
				r.push(`telling ${him}`);
			} else {
				r.push(`nudging and gesturing at ${him}`);
			}
			r.push(`to continue. ${He} does, bending ${him} back forward and backward, concave and convex, rolling ${himself} around on ${his} hips a little, and making ${his}`);
			if (eventSlave.belly >= 5000) {
				r.push(`${belly} belly and`);
			}
			r.push(`breasts move mesmerizingly. Eventually, ${he} stretches deeply enough that`);
			if (eventSlave.trust <= 50) {
				r.push(`${he} lets ${his} guard down and`);
			}
			r.push(`${his} eyes close again.`);
			switch (eventSlave.nipples) {
				case "tiny":
					r.push(`${His} tiny little nipples are too small to grab and pull effectively, so you simply flick them, aiming a vicious high-velocity fingernail at each of them, using both hands.`);
					break;
				case "puffy":
					r.push(`${His} puffy nipples provide shamefully easy targets. You grab them in a mercilessly tight grip and haul, jerking ${his} whole body forward until ${he}'s about to topple over.`);
					break;
				case "partially inverted":
					r.push(`You grab each of ${his} nipples around the margins of ${his} areolae, and squeeze them with such force that, partially inverted as they are, they protrude instantly.`);
					break;
				case "inverted":
					r.push(`You seize each of ${his} inverted nipples, your thumbs uppermost, squeezing ${his} sensitive, hidden nipples inside their fleshy prisons with cruel force.`);
					break;
				case "huge":
					r.push(`${His} huge nipples provide you an excellent grip as you grab them and haul on them, jerking ${his} whole body forward until ${he}'s about to topple over.`);
					break;
				case "fuckable":
					r.push(`You cram a fist into each of ${his} nipples and spread your fingers wide, making sure that you don't come loose as you jerk ${his} body forward.`);
					break;
				default:
					r.push(`You grab each of ${his} nipples in a merciless grip and pinch them with abandon, adding a cruel twist as soon as you've got them held tightly enough.`);
			}
			r.push(`${His} ${App.Desc.eyesColor(eventSlave)} fly open and ${he}`);
			if (canTalk(eventSlave, false)) {
				if (eventSlave.voice === 1) {
					r.push(`bellows with pain, ${his} deep voice very loud.`);
				} else if (eventSlave.voice === 2) {
					r.push(`screams at the tops of ${his} lungs.`);
				} else if (eventSlave.voice === 3) {
					r.push(`shrieks, ${his} high, girlish voice very shrill.`);
				}
			} else {
				r.push(`goes rigid in pain. If ${he} was able to cry out, you know ${he} would have.`);
			}
			r.push(`The sudden agony discombobulates ${him} so badly that for a few moments, ${he} has no idea what's going on, and ${his} hands fly forward reflexively. ${He} manages to stop ${himself} at the last minute, realizing that trying to knock your hands away from ${his} poor nipples would be a very bad idea indeed. ${He} looks up at you with`);
			if (canSee(eventSlave)) {
				r.push(`huge eyes,`);
			} else {
				r.push(`terror splashed across ${his} face,`);
			}
			if (canTalk(eventSlave, false)) {
				r.push(`mewling helplessly,`);
			}
			r.push(`<span class="trust dec">tears beginning to collect at the corners of ${his} eyes.</span> Pleased, you turn and go.`);
			eventSlave.trust -= 5;
			r.toParagraph();
			frag.append(App.Events.eventFetish(eventSlave, "masochist"));
			return r.container();
		}

		function drink() {
			const frag = document.createDocumentFragment();
			const r = new SpacedTextAccumulator(frag);
			r.push(`${His}`);
			if (canSee(eventSlave)) {
				r.push(`eyes widen`);
			} else {
				r.push(`face light up`);
			}
			r.push(`with surprise when you`);
			if (eventSlave.belly >= 300000) {
				r.push(`lean against ${his} ${belly} stomach.`);
			} else {
				r.push(`kneel down in front of ${him}.`);
			}
			r.push(`${He} begins to straighten, to face you, but you place a`);
			if (V.PC.title === 1) {
				r.push(`strong`);
			} else {
				r.push(`feminine`);
			}
			r.push(`hand on ${his} chest, right between ${his} breasts, and keep ${him} leaning backward. Then, without any preamble, you take ${his} right breast in both of your hands, bend forward, and take ${his} nipple into your mouth. ${He} gasps`);
			if (canTalk(eventSlave)) {
				r.addToLast(`, ${say}s "Oh, ${Master}"`);
			}
			r.push(`quietly, and then begins to moan as you begin to suck powerfully,`);
			switch (eventSlave.nipples) {
				case "tiny":
					r.push(`drawing ${his} tiny nipple entirely into your mouth.`);
					break;
				case "puffy":
					r.push(`engorging ${his} soft, puffy nipple until it fills your mouth.`);
					break;
				case "partially inverted":
					r.push(`pulling ${his} partially inverted nipple straight out and into your mouth.`);
					break;
				case "inverted":
					r.push(`gradually pulling at ${his} inverted nipple until it's finally forced to pop out and into your mouth.`);
					break;
				case "huge":
					r.push(`${his} huge nipple filling your mouth comfortably.`);
					break;
				case "fuckable":
					r.push(`drawing an unreasonable amount of breast into your mouth just to keep a seal.`);
					break;
				case "flat":
					r.push(`pulling ${his} nipple and the areolae around it into your mouth.`);
					break;
				default:
					r.push(`pulling ${his} soft nipple and some of the areolae around it into your mouth.`);
			}
			r.push(`${His} rich ${milkFlavor(eventSlave)}milk begins to flow across your tongue. ${He} breathes faster and faster as ${he} becomes aroused, but then the stimulation peaks. You keep drinking from ${him}, making no move to stop nursing and start fucking ${him}. ${He} sighs with sudden contentment, realizing that you're going to drink every drop ${he} has, and ${his} sudden relaxation sends a little extra gush of ${milkFlavor(eventSlave)}milk into your mouth. ${He} <span class="hotpink">definitely enjoys the experience,</span> leaning back compliantly as you drain that breast and then ${his} left one, too.`);
			if (eventSlave.boobs > 25000 || (eventSlave.boobs > 10000 && eventSlave.lactation > 1)) {
				r.push(`Your clothes feel tight around your middle for the rest of the day; you may have indulged a little too much.`);
			}
			eventSlave.devotion += 5;
			eventSlave.lactationDuration = 2;
			eventSlave.boobs -= eventSlave.boobsMilk;
			eventSlave.boobsMilk = 0;
			r.toParagraph();
			frag.append(App.Events.eventFetish(eventSlave, "boobs"));
			return r.container();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				s => canTalk(s, false),
				s => s.assignment !== Job.QUARTER,
				s => s.devotion <= 20,
				s => s.trust < -20,
				s => s.rules.living === "spare",
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, hers
		} = getPronouns(eventSlave);
		const belly = bellyAdjective(eventSlave);

		App.Events.drawEventArt(node, eventSlave, "no clothing");

		let r = [];
		r.push(
			`Passing near the slave dormitory late at night, you hear a quiet cry within. This is strange; most slaves housed there are not inclined or not allowed to have sex in the middle of the night, and in any case, the noise wasn't one of pleasure. Looking in, you see a jerky movement near the door. It's`,
			App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), ","),
			`and ${he}'s obviously having a bad dream. ${He} raises`
		);
		if (hasBothArms(eventSlave)) {
			r.push(`an`);
		} else {
			r.push(`${his}`);
		}
		r.push(`arm to fend off some imagined danger, and in doing so, pushes the sheet down around ${his} waist. ${He} sleeps naked, like all your slaves, and the movement bares ${his}`);
		if (eventSlave.boobs > 2000) {
			r.push(`udders`);
		} else if (eventSlave.boobs > 1000) {
			r.push(`heavy breasts`);
		} else if (eventSlave.boobs > 400) {
			r.push(`boobs`);
		} else {
			r.push(`little tits`);
		}
		if (eventSlave.belly >= 5000) {
			r.push(`and ${belly}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnant`);
			}
			r.push(`belly`);
		}
		r.push(`to the cool night air. The low blue light outlines ${his} nipples as they`);
		if (eventSlave.nipples !== "fuckable") {
			r.push(`stiffen`);
		} else {
			r.push(`swell`);
		}
		r.push(`at the sudden change of temperature,`);
		switch (eventSlave.nipples) {
			case "tiny":
				r.push(`pricking up into little buds.`);
				break;
			case "flat":
				r.push(`becoming visible against ${his} areolae.`);
				break;
			case "puffy":
				r.push(`the puffy promontories jutting even farther out.`);
				break;
			case "partially inverted":
				r.push(`just starting to poke past their inversion.`);
				break;
			case "inverted":
				r.push(`the twin domes formed by their inverted shapes becoming more prominent.`);
				break;
			case "huge":
				r.push(`becoming so large they cast long shadows across ${his} bed.`);
				break;
			case "fuckable":
				r.push(`the fuckable holes steadily closing and starting to poke outwards.`);
				break;
			default:
				r.push(`becoming attractively erect.`);
		}
		r.push(`Still dreaming, ${he} clasps ${his}`);
		if (hasBothArms(eventSlave)) {
			r.push(`arms`);
		} else {
			r.push(`arm`);
		}
		r.push(`protectively over ${his}`);
		if (eventSlave.pregKnown === 1) {
			r.push(`unborn`);
			if (eventSlave.pregType > 1) {
				r.push(`children,`);
			} else {
				r.push(`child,`);
			}
		} else {
			r.push(`vulnerable chest,`);
		}
		r.push(`and rolls to one side. Halfway into a fetal position, ${he} turns ${his} head against ${his} pillow, murmuring`);
		if (eventSlave.accent <= 2) {
			r.push(Spoken(eventSlave, `"N-no — please no — I'll d-do anyth-thing — no..."`));
		} else {
			r.push(`earnest protests in ${his} mother tongue.`);
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
		/* TODO: add a positive variant */
			new App.Events.Result(`Let ${him} be`, leave),
			new App.Events.Result(`Hug ${him}`, hug),
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Rape ${him}`, rape, ((eventSlave.vagina === 0 && canDoVaginal(eventSlave)) || (eventSlave.anus === 0) && canDoAnal(eventSlave)) ? `This option will take ${his} virginity` : null)
				: new App.Events.Result(),
		]);

		function leave() {
			return `It may be for the best to not disturb ${his} restless slumber, you decide. Admiring the attractive view for just a moment longer, you turn back and head to your own bed. The next morning, it appears as though ${eventSlave.slaveName} doesn't even remember this nightmare.`;
		}

		function hug() {
			r = [];
			r.push(`You reach out to hug ${him}, but as soon as your hand touches ${his} shoulder, ${he} writhes instinctively away.`);
			if (canSee(eventSlave)) {
				r.push(`${His} eyes fly open, searching frantically for ${his} assailant. Seeing that it's you, ${he} screams and scrabbles away even harder. After making it a few feet, ${he} collects ${his} wits enough to bring ${himself} to a stop and stop screaming, though ${he} continues to sob, staring at you in terror.`);
			} else {
				r.push(`${He} gropes frantically for ${his} assailant, before making contact with you. ${He} screams and scrabbles away, only stopping when ${he} collides with the nearest solid object.`);
				if (canHear(eventSlave)) {
					r.push(`Only after several call outs that it is you does ${he} stop screaming, though ${he} continues to sob, listening to your every breath in terror.`);
				} else {
					r.push(`After screaming ${himself} hoarse, ${he} realizes that ${his} assault has abruptly ended, and gently feels around ${his} surroundings with a shaking hand to discover ${himself} back in ${his} room.`);
				}
			}
			r.push(`${He} remains frozen in place as you slowly advance on ${him} and give ${him} a light embrace. ${His} tears gradually stop, but ${he} does not relax,`);
			if (canSee(eventSlave)) {
				r.push(`remaining dumbly stiff`);
			} else {
				r.push(`continuing to quake in fear`);
			}
			r.push(`within your arms. Eventually you let ${him} go, and ${he} crawls pathetically back under ${his} sheet, still weeping softly. It seems ${he} is more afraid of you than ever, and if you thought that a simple hug could win ${him} over, you were wrong.`);
			if (canSee(eventSlave)) {
				eventSlave.trust -= 4;
			} else if (canHear(eventSlave)) {
				eventSlave.trust -= 5;
			} else {
				eventSlave.trust -= 6;
			}
			return r;
		}

		function rape() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You snatch the sheet off ${him}, shove ${his} uppermost shoulder down so ${his} face is smashed into the pillow, and bring your knees down between ${his} legs, spreading them to force ${hers} apart. You use the hand that isn't controlling ${his} torso to locate ${his}`); // TODO: add support for one-handed PC?
			if (canDoVaginal(eventSlave)) {
				if (eventSlave.vagina > 2) {
					r.push(`amusingly loose cunt`);
				} else if (eventSlave.vagina > 1) {
					r.push(`large womanhood`);
				} else if (eventSlave.vagina > 0) {
					r.push(`tight pussy`);
				} else {
					r.push(`poor virgin pussy`);
				}
			} else {
				if (eventSlave.anus > 2) {
					r.push(`amusingly broad asshole`);
				} else if (eventSlave.anus > 1) {
					r.push(`big butthole`);
				} else if (eventSlave.anus > 0) {
					r.push(`tight rosebud`);
				} else {
					r.push(`poor virgin anus`);
				}
			}
			r.push(`in the dark as ${he} begins to <span class="trust dec">struggle and scream.</span> ${He} comes fully awake when ${he} feels your rough fingers searching for and then finding ${his}`);
			if (eventSlave.vagina >= 0 && canDoVaginal(eventSlave)) {
				r.push(`vagina,`);
			} else {
				r.push(`crinkled hole,`);
			}
			r.push(`and ${his} noise increases to the point where it becomes annoying. You stuff ${his} face into the pillow and take ${him} mercilessly, using the pillow to cut off ${his} breath whenever ${he} struggles too much, until oncoming suffocation forces ${him} to go still and take it like a good little bitch.`);
			App.Events.addParagraph(frag, r);
			App.Events.addParagraph(frag, [`<span class="devotion dec">Sometimes dreams do come true.</span>`]);
			App.Events.addParagraph(frag, [VCheck.Simple(eventSlave, 1)]);
			eventSlave.trust -= 4;
			eventSlave.devotion -= 4;
			return frag;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				s => s.relationship <= -2,
				s => s.trust > 50,
				s => s.devotion > 50,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him
		} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const children = eventSlave.pregType > 1 ? "children" : "child";

		App.Events.drawEventArt(node, eventSlave, "no clothing");

		const r = new SpacedTextAccumulator(node);
		r.push(
			`Working in your office early in the morning, you can hear the low, human hum of your slaves who work during the daytime busily getting ready for their days. Suddenly, there's motion at your doorway, and`,
			contextualIntro(V.PC, eventSlave, true),
			`hurries in. ${He}'s nude, ${his} ${eventSlave.skin} skin glowing with the fresh cleanliness of having just gotten out of the shower. ${He}`,
		);
		if (canSee(eventSlave)) {
			r.push(`glances at you`);
		} else if (canHear(eventSlave)) {
			r.push(`listens`);
		} else {
			r.push(`waits`);
		}
		r.push(`to see if ${he}'s unwelcome, and seeing no sign that ${he} is, the devoted ${SlaveTitle(eventSlave)} comes over to your desk.`);
		if (eventSlave.boobs < 400) {
			r.push(`${His} little${eventSlave.boobShape === "normal" ? `` : ` ${eventSlave.boobShape}`} tits barely move at all as ${he} walks, though ${his} ${eventSlave.nipples} nipples certainly catch your eye.`);
		} else if ((eventSlave.boobsImplant/eventSlave.boobs) >= .75) { // tiny little 200cc implants in 20000cc tits are laughable. Now we make sure those tits are fake.
			r.push(`${His} fake tits barely move at all as ${he} walks, their shape maintained by ${his} implants.`);
		} else if (eventSlave.boobs < 1000) {
			r.push(`${His} lovely${eventSlave.boobShape === "normal" ? `` : ` ${eventSlave.boobShape}`} boobs move delightfully as ${he} walks, and ${his} ${eventSlave.nipples} nipples bounce prettily.`);
		} else if (eventSlave.boobs < 2500) {
			r.push(`${His} heavy${eventSlave.boobShape === "normal" ? `` : `, ${eventSlave.boobShape}`} breasts bounce up and down as ${he} walks, making ${his} ${eventSlave.nipples} nipples dance around distractingly.`);
		} else {
			r.push(`${His} massive${eventSlave.boobShape === "normal" ? `` : `, ${eventSlave.boobShape}`} udders jiggle alluringly as ${he} walks, and ${his} ${eventSlave.nipples} nipples sway from side to side distractingly.`);
		}
		r.push(`Your eyes move down ${his} body, noting`);
		if (eventSlave.bellyPreg >= 450000) {
			r.push(`${his} ${belly} belly,`);
			if (eventSlave.pregSource === -1) {
				r.push(`practically bursting with your ${children},`);
			}
			r.push(`and how ${he} struggles to walk with it while keeping all the kicking from throwing ${him} off balance.`);
		} else if (eventSlave.belly >= 450000) {
			r.push(`${his} ${belly} belly and how the struggles to walk with it without bumping things.`);
		} else if (eventSlave.bellyPreg >= 150000) {
			r.push(`${his} ${belly} belly,`);
			if (eventSlave.pregSource === -1) {
				r.push(`completely filled with your ${children},`);
			}
			r.push(`and the slight movement within with each struggling step ${he} takes.`);
		} else if (eventSlave.belly >= 150000) {
			r.push(`${his} ${belly} belly and the vastly altered gait ${he} steps with to handle it.`);
		} else if (eventSlave.bellyPreg >= 10000) {
			r.push(`${his} full-term pregnant belly,`);
			if (eventSlave.pregSource === -1) {
				r.push(`rounded with your ${children},`);
			} else {
				r.push(`which`);
			}
			r.push(`adds a distinct awkwardness to ${his} gait.`);
		} else if (eventSlave.bellyFluid >= 10000) {
			r.push(`${his} straining ${eventSlave.inflationType}-filled belly and how ${he} struggles to walk normally with it.`);
		} else if (eventSlave.bellyImplant >= 10000) {
			r.push(`${his} full-term pregnancy-looking belly and how it adds a distinct awkwardness to ${his} gait.`);
		} else if (eventSlave.bellyPreg >= 5000) {
			r.push(`${his} hugely pregnant belly,`);
			if (eventSlave.pregSource === -1) {
				r.push(`rounded with your ${children},`);
			} else {
				r.push(`which`);
			}
			r.push(`adds a certain unavoidable awkwardness to ${his} gait.`);
		} else if (eventSlave.bellyFluid >= 5000) {
			r.push(`${his} ${eventSlave.inflationType}-filled belly and the delightful jiggle that runs through it with each step.`);
		} else if (eventSlave.bellyImplant >= 5000) {
			r.push(`${his} hugely rounded belly and the certain unavoidable awkwardness in ${his} gait it causes.`);
		} else if (eventSlave.weight >= 95) {
			r.push(`${his} big fat belly and how it sways and jiggles with each step.`);
		} else if (eventSlave.bellyPreg >= 1500) {
			r.push(`${his} pregnant belly,`);
			if (eventSlave.pregSource === -1) {
				r.push(`swollen with your ${children},`);
			} else {
				r.push(`which`);
			}
			r.push(`isn't truly huge yet, but clearly advertises ${his} status as a breeding ${SlaveTitle(eventSlave)}.`);
		} else if (eventSlave.bellyFluid >= 2000) {
			r.push(`the slight bloat to ${his} belly caused by the liters of ${eventSlave.inflationType} held inside ${him}.`);
		} else if (eventSlave.bellyImplant >= 1500) {
			r.push(`${his} slightly rounded belly, not truly noticeable, but enough to advertise ${him} as a breeding ${SlaveTitle(eventSlave)}, even though it's fake.`);
		} else if (eventSlave.hips === 3) {
			r.push(`${his} extremely wide hips and the cartoonish sway to them as ${he} walks.`);
		} else if (eventSlave.muscles > 30) {
			r.push(`${his} rippling abs, which work visibly as ${he} walks, flexing and straining powerfully underneath ${his} ${eventSlave.skin} skin.`);
		} else if (eventSlave.waist < -95) {
			r.push(`${his} cartoonish wasp waist and the way it emphasizes ${his} status as a sex toy.`);
		} else if (eventSlave.hips > 0) {
			r.push(`${his} wide hips and the sensual sway to them as ${he} walks.`);
		} else if (eventSlave.waist < -10) {
			r.push(`${his} nice narrow waist and the way it emphasizes the feminine swell of ${his} hips.`);
		} else if (eventSlave.weight > 30) {
			r.push(`${his} chubby belly and how it jiggles as ${he} walks, ${his} plush fat moving voluptuously with ${him}.`);
		} else if (eventSlave.weight > 10) {
			r.push(`${his} plush belly and how it jiggles a little as ${he} walks, giving ${him} a soft and sensual appeal.`);
		} else {
			r.push(`${his} trim belly before looking further down.`);
		}
		r.push(`Below that,`);
		if (eventSlave.dick > 0) {
			if (canAchieveErection(eventSlave)) {
				r.push(`${his} cock is soft for once, probably from the shower; it`);
			} else if (eventSlave.dick > maxErectionSize(eventSlave)) {
				if (V.maxErectionSizeOption === 0) {
					r.push(`${his} soft python of a cock`);
				} else {
					r.push(`${his} soft, oversized cock`);
				}
			} else {
				r.push(`${his} soft bitchclit`);
			}
			if (eventSlave.dick > 4) {
				r.push(`flops around lewdly`);
			} else if (eventSlave.dick > 2) {
				r.push(`bounces around`);
			} else {
				r.push(`wiggles pathetically`);
			}
			r.push(`as ${he} moves.`);
		} else if (eventSlave.labia > 0) {
			r.push(`${his} generous petals, flushed and a little full from the warmth of the shower, offer soft, healthy advertisement of ${his} womanhood.`);
		} else if (eventSlave.clit > 0) {
			r.push(`${his} prominent clit, flushed and a little full from the warmth of the shower, offers soft testament to ${his} female sexuality.`);
		} else if (eventSlave.piercing.genitals.weight > 0) {
			r.push(`${his} glinting`);
			if (eventSlave.dick === 0) {
				r.push(`clit`);
			} else {
				r.push(`dick`);
			}
			r.push(`piercing catches your eye, just as it's meant to do.`);
		} else if (eventSlave.vagina === -1) {
			r.push(`the smooth, featureless skin between ${his} legs is a little flushed; the tiny hole in it is barely noticeable.`);
		} else {
			r.push(`${his} healthy womanhood looks a little flushed from the warmth of the shower.`);
		}
		r.push(`Coming to a stop, ${he}`);
		if (eventSlave.height > 190) {
			r.push(`bends the long, long way down necessary to bring`);
		} else if (eventSlave.height < 155) {
			r.push(`bends the amusingly short way down ${he} needs to bring`);
		} else {
			r.push(`bends down`);
		}
		r.push(`to bring ${his}`);
		if (eventSlave.lips > 40) {
			r.push(`pillowy`);
		} else if (eventSlave.piercing.lips.weight > 0) {
			r.push(`pierced`);
		}
		r.push(`lips next to your ear.`);

		r.toParagraph();

		if (!canTalk(eventSlave)) {
			r.push(`${He} mouths 'I love you, ${getWrittenTitle(eventSlave)},' holding ${his} hands out in front of you both to say it in sign language at the same time.`);
		} else {
			r.push(`"I love you, ${Master}," ${he} whispers.`);
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Tell ${him} ${he}'s a good slave`, good),
			new App.Events.Result(`Tell ${him} you love ${him} too`, love),
		]);

		function good() {
			const r = new SpacedTextAccumulator();
			r.push(`Without turning your head, you tell ${him} ${he}'s a very good slave. ${He} laughs happily,`);
			if (!canTalk(eventSlave)) {
				r.addToLast(`though of course this is silent,`);
			}
			r.push(`${his} warm breath gusting against your ear. It took confidence for ${him} to come in here and tell ${him} ${he} loved you, and ${he} trusts you more for responding this way. ${He} plants a light kiss on your cheek and walks quickly out of your office, hurrying to go about ${his} day's business, but careful to strut ${his} stuff for you on ${his} way out.`);
			if (eventSlave.butt < 3) {
				r.push(`${His} nice little butt moves cutely as ${he} goes. ${His} small buttocks leave`);
				if (!canDoAnal(eventSlave)) {
					r.push(`${his} anal chastity visible from the rear as ${he} walks.`);
				} else if (eventSlave.analArea > 3) {
					r.push(`the huge area of puckered skin around ${his} asspussy clearly visible from the rear, and ${his} asshole works lewdly with the motion.`);
				} else if (eventSlave.anus > 1) {
					r.push(`${his} asshole visible, the pucker of ${his} backdoor lewdly available.`);
				} else {
					r.push(`${his} tight anus visible from the rear as ${he} walks.`);
				}
			} else if (eventSlave.butt < 6) {
				r.push(`${His} healthy butt bounces as ${he} goes. ${His} big buttocks mostly conceal`);
				if (!canDoAnal(eventSlave)) {
					r.push(`${his} anal chastity, but there's the occasional tempting glimpse.`);
				} else if (eventSlave.analArea > 3) {
					r.push(`the huge area of puckered skin around ${his} asspussy, but ${his} butthole is so well used that it's obvious from the rear that ${he} takes it up the ass. A lot.`);
				} else if (eventSlave.anus > 1) {
					r.push(`${his} backdoor, but there's the occasional cute glimpse of ${his} experienced anus.`);
				} else {
					r.push(`what's between them, but there's the occasional cute glimpse of ${his} tight rosebud.`);
				}
			} else {
				r.push(`${His} gigantic ass jiggles as ${he} goes. ${His} enormous buttocks mostly stay together as ${he} moves,`);
				if (!canDoAnal(eventSlave)) {
					r.push(`completely swallowing ${his} anal chastity.`);
				} else if (eventSlave.analArea > 3) {
					r.push(`almost concealing the huge area of puckered skin around ${his} lewd asspussy.`);
				} else if (eventSlave.anus > 1) {
					r.push(`completely concealing ${his} welcoming backdoor.`);
				} else {
					r.push(`completely concealing ${his} tight asshole.`);
				}
			}
			r.push(`${He} pauses for an instant in the doorway, turns over ${his} shoulder to give you a sexy wink, and is gone.`);
			eventSlave.trust += 4;
			r.toParagraph();
			return r.container();
		}

		function love() {
			const r = new SpacedTextAccumulator();
			r.push(`You turn towards ${him} and direct the full weight of your gaze into ${his} eyes.`);
			if (canSee(eventSlave)) {
				r.push(`${His} eyelids flicker with the shock of the shared look,`);
			} else {
				r.push(`${His} eyes may not be capable of sight, but ${he} can feel your gaze,`);
			}
			r.push(`so close, but ${he} bears it, biting ${his} lower lip. Then you kiss ${him}. The released tension is too much for ${him}, and ${he} moans, slumping against you a little as you kiss ${him} like a lover. ${He}'s so lost in it that when you break the kiss, ${his} mouth stays slightly open and pursues yours slightly, hungry for more. You place a finger against ${his} moist lips, making ${him} wait a moment, and tell ${him} that you love ${him} too. ${He} makes`);
			if (eventSlave.voice === 0) {
				r.push(`a quiet moaning sound, deep in ${his} useless throat,`);
			} else {
				r.push(`an almost animal sound, somewhere between a sob and a moan,`);
			}
			r.push(`and as you withdraw your finger, ${he} kisses you back. ${He} knows ${he} has a job to do today, and it's waiting for ${him}, so when you give ${him} no indication that you'd like ${him} to stay, ${he} withdraws, keeping ${his}`);
			if (canSee(eventSlave)) {
				r.push(`eyes`);
			} else {
				r.push(`face`);
			}
			r.push(`on yours, doing ${his} best to <span class="devotion inc">make love to you</span> with ${his} gaze.`);
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}
	}
};