code:
App.Neighbor.Interact = function() {
	const node = new DocumentFragment();

	App.UI.DOM.appendNewElement("h1", node, `Diplomacy`);

	if (V.cheatMode === 1) {
		App.UI.DOM.appendNewElement("div", node,
			App.UI.DOM.passageLink("Cheat Edit Neighboring Arcologies", "Neighbor Arcology Cheat"),
			["cheat-menu"]);
	}
	App.UI.DOM.appendNewElement("p", node, `You have ${V.arcologies.length - 1} neighbors.`);

	/** Return how much resources are being put towards the current choice.
	 * @param {string} option
	 */
	function affect(option) {
		if (V.arcologies[0][option] === 3) {
			return App.UI.DOM.makeElement("span", "widespread", "bold");
		} else if (V.arcologies[0][option] === 2) {
			return App.UI.DOM.makeElement("span", "limited", "bold");
		} else {
			return App.UI.DOM.makeElement("span", "nominal", "bold");
		}
	}

	/** Return a list of links based off how much resources are being put towards the current choice.
	 * @param {string} option
	 */
	function makeLinkList(option) {
		let linkArray = [];
		if (V.arcologies[0][option] < 3) {
			linkArray.push(App.UI.DOM.link(
				"Intensify",
				() => {
					V.arcologies[0][option]++;
					App.UI.reload();
				}
			));
		}
		if (V.arcologies[0][option] > 1) {
			linkArray.push(App.UI.DOM.link(
				"Moderate",
				() => {
					V.arcologies[0][option]--;
					App.UI.reload();
				}
			));
		}
		linkArray.push(App.UI.DOM.link(
			"Cancel",
			() => {
				V.arcologies[0][option + "Target"] = -1;
				App.UI.reload();
			}
		));
		return App.UI.DOM.generateLinksStrip(linkArray);
	}

	let nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].embargoTarget; });
	if (!nei) {
		App.UI.DOM.appendNewElement("div", node, `You are not engaged in economic warfare against a neighboring arcology.`);
	} else {
		App.Events.addNode(node, [
			`You have targeted`,
			App.UI.DOM.makeElement("span", nei.name, "bold"),
			`for`,
			affect("embargo"),
			`economic warfare.`
		], "div");
		App.UI.DOM.appendNewElement("div", node, makeLinkList("embargo"), "indent");
	}

	nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].influenceTarget; });
	if (!nei) {
		App.UI.DOM.appendNewElement("div", node, `You are not using your arcology's culture to attempt to influence neighboring arcologies' development.`);
	} else {
		App.Events.addNode(node, [
			`You have targeted`,
			App.UI.DOM.makeElement("span", nei.name, "bold"),
			`for cultural influence.`,
			App.UI.DOM.link("Stop",
				() => {
					V.arcologies[0].influenceTarget = -1;
					App.UI.reload();
				}
			)
		], "div");
	}

	if (V.PC.skill.hacking > 0) {
		nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].CyberEconomicTarget; });
		if (!nei) {
			App.UI.DOM.appendNewElement("div", node, `You are not engaged in cyber warfare against a neighboring arcology.`);
		} else {
			App.Events.addNode(node, [
				`You have targeted`,
				App.UI.DOM.makeElement("span", nei.name, "bold"),
				`for`,
				affect("CyberEconomic"),
				`cyber economic warfare.`
			], "div");
			App.UI.DOM.appendNewElement("div", node, makeLinkList("CyberEconomic"), "indent");
		}

		nei = V.arcologies.find(function(s) { return s.direction === V.arcologies[0].CyberReputationTarget; });
		if (!nei) {
			App.UI.DOM.appendNewElement("div", node, `You are not engaged in character assassination against a neighboring arcology.`);
		} else {
			App.Events.addNode(node, [
				`You have targeted the leadership of`,
				App.UI.DOM.makeElement("span", nei.name, "bold"),
				`for`,
				affect("CyberReputation"),
				`character assassination.`
			], "div");
			App.UI.DOM.appendNewElement("div", node, makeLinkList("CyberReputation"), "indent");
		}
	}

	const interact = (function() {
		let nd = new App.Neighbor.Display((id) => replaceDetails(id));
		const DEMAND_PER_PERCENT = 2;

		return list;

		/** Output the arcology list
		 * @returns {DocumentFragment}
		 */
		function list() {
			for (let i = 1; i < V.arcologies.length; i++) {
				V.arcologies[i].prosperity = Math.clamp(V.arcologies[i].prosperity, 1, 400);
			}
			if (!V.activeArcologyIdx) {
				V.activeArcologyIdx = 0;
			}

			let frag = document.createDocumentFragment();

			// set up the neighbor display list itself
			frag.append(nd.render());
			$(document).one(':passagedisplay', () => nd.select(V.activeArcologyIdx));

			// empty container for details
			const detailSpan = App.UI.DOM.appendNewElement("span", frag, "", "margin-top");
			detailSpan.id = "neighbor-details";

			return frag;
		}

		/** Replace the details block with an updated one for the given arcology
		 * Used both as a refresh and as a selection handler
		 * @param {number} arcID
		 */
		function replaceDetails(arcID) {
			V.activeArcologyIdx = arcID;
			const container = $("#neighbor-details").empty();
			container.append(App.UI.neighborDescription(arcID));
			container.append(details(arcID));
		}

		/** Re-render most of the page because some important arcology property (FS, government, ownership) may have changed
		 * @param {number} arcID for reselection
		 */
		function arcChanged(arcID) {
			nd.rerender();
			nd.select(arcID);
		}

		/** Create a fragment containing all the details for a given arcology
		 * @param {number} arcID
		 * @returns {DocumentFragment}
		 */
		function details(arcID) {
			let frag = document.createDocumentFragment();
			if (arcID === 0) {
				const desc = FutureSocieties.activeFSes(V.arcologies[0]).map((f) => FutureSocieties.displayName(f));
				if (desc.length === 0) {
					App.UI.DOM.appendNewElement("p", frag, `Your arcology's culture has not developed to the point where it can meaningfully influence other arcologies.`);
				} else if (desc.length > 2) {
					App.UI.DOM.appendNewElement("p", frag, `Your arcology's mature culture is capable of exerting great cultural sway over other arcologies. It can readily project ${toSentence(desc)}.`);
				} else if (desc.length === 2) {
					App.UI.DOM.appendNewElement("p", frag, `Your arcology's culture is capable of exerting some cultural sway over other arcologies. It can effectively project ${desc[0]} and ${desc[1]}.`);
				} else {
					App.UI.DOM.appendNewElement("p", frag, `Your arcology's culture is capable of starting to exert cultural sway over other arcologies. It can project ${desc[0]}.`);
				}
			} else {
				frag.append(`A 1% interest in this arcology is worth ${cashFormat(buyValue(V.arcologies[arcID], 1))}. `);
				if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 100) {
					frag.append(`The transaction fee is ${cashFormat(10000)}.`);
				}

				if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 100) {
					let links = [];
					links.push(App.UI.DOM.link("Buy", () => {
						cashX(-(buyValue(V.arcologies[arcID], 1) + 10000), "war");
						V.arcologies[arcID].PCminority += 1;
						V.arcologies[arcID].demandFactor += DEMAND_PER_PERCENT;
					}, [], "Neighbor Interact"));
					if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority <= 90) {
						if (V.cash > buyValue(V.arcologies[arcID], 10) + 10000) {
							const link = App.UI.DOM.link("10%", () => {
								cashX(-(buyValue(V.arcologies[arcID], 10) + 10000), "war");
								V.arcologies[arcID].PCminority += 10;
								V.arcologies[arcID].demandFactor += DEMAND_PER_PERCENT * 10;
							}, [], "Neighbor Interact");
							links.push(link);
						}
					}
					const div = App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.generateLinksStrip(links));
					if (links.length > 1) {
						App.UI.DOM.appendNewElement("span", div, " Transaction costs will only be paid once.", ["detail"]);
					}
				}

				if (V.arcologies[arcID].PCminority > 0) {
					let links = [];
					links.push(App.UI.DOM.link("Sell", () => {
						cashX(sellValue(V.arcologies[arcID], 1), "war");
						V.arcologies[arcID].PCminority -= 1;
						V.arcologies[arcID].demandFactor -= DEMAND_PER_PERCENT;
						if (V.arcologies[arcID].government !== "your agent" && V.arcologies[arcID].government !== "your trustees" && V.arcologies[arcID].rival !== 1) {
							if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 10) {
								V.arcologies[arcID].ownership += 10;
							}
						}
						arcChanged(arcID);
					}, [], "Neighbor Interact"));
					if (V.arcologies[arcID].PCminority >= 10) {
						links.push(App.UI.DOM.link("10%", () => {
							cashX(sellValue(V.arcologies[arcID], 10), "war");
							V.arcologies[arcID].PCminority -= 10;
							V.arcologies[arcID].demandFactor -= DEMAND_PER_PERCENT * 10;
							if (V.arcologies[arcID].government !== "your agent" && V.arcologies[arcID].government !== "your trustees" && V.arcologies[arcID].rival !== 1) {
								if (V.arcologies[arcID].ownership + V.arcologies[arcID].PCminority + V.arcologies[arcID].minority < 10) {
									V.arcologies[arcID].ownership += 10;
								}
							}
						}, [], "Neighbor Interact"));
					}
					App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.generateLinksStrip(links));
				}

				if (V.arcologies[arcID].direction !== V.arcologies[0].embargoTarget) {
					frag.append(document.createElement("br"));
					frag.append(App.UI.DOM.passageLink("Target them for economic warfare", "Neighbor Interact", () => V.arcologies[0].embargoTarget = V.arcologies[arcID].direction));
				}

				if (V.PC.skill.hacking > 0) {
					if (V.arcologies[arcID].direction !== V.arcologies[0].CyberEconomicTarget) {
						frag.append(document.createElement("br"));
						frag.append(App.UI.DOM.passageLink("Target them for cyber economic warfare", "Neighbor Interact", () => V.arcologies[0].CyberEconomicTarget = V.arcologies[arcID].direction));
					}
					if (V.arcologies[arcID].direction !== V.arcologies[0].CyberReputationTarget) {
						frag.append(document.createElement("br"));
						frag.append(App.UI.DOM.passageLink("Target their leadership for character assassination", "Neighbor Interact", () => V.arcologies[0].CyberReputationTarget = V.arcologies[arcID].direction));
					}
				}
				if (FutureSocieties.influenceSources(0).length > 0) {
					if (V.arcologies[arcID].direction !== V.arcologies[0].influenceTarget) {
						frag.append(document.createElement("br"));
						frag.append(App.UI.DOM.passageLink("Set as influence target", "Neighbor Interact", () => V.arcologies[0].influenceTarget = V.arcologies[arcID].direction));
					}
				}

				if (V.arcologies[arcID].government === "your trustees" || V.arcologies[arcID].government === "your agent") {
					frag.append(controlActions(arcID));
				}

				frag.append(fsGoods(arcID));
			}
			return frag;
		}

		/**
		 * How much does it cost to buy x percent of a given arcology
		 * @param {FC.ArcologyState} arc
		 * @param {number} percent
		 * @returns {number}
		 */
		function buyValue(arc, percent) {
			const baseValue = 500 * arc.prosperity;
			// scale the demand in such a way that buying twice in a row costs the same as buying double once.
			const scaledDemand = arc.demandFactor + (DEMAND_PER_PERCENT * (percent / 2));
			const scalingFactor = 1 + (scaledDemand / 100);
			return Math.round(baseValue * scalingFactor * percent);
		}

		/**
		 * How much does the player get when selling x percent of a given arcology
		 * @param {FC.ArcologyState} arc
		 * @param {number} percent
		 * @returns {number}
		 */
		function sellValue(arc, percent) {
			const baseValue = 500 * arc.prosperity;
			// scale the demand in such a way that selling twice in a row gives the same as selling double once.
			const scaledDemand = arc.demandFactor - (DEMAND_PER_PERCENT * (percent / 2));
			const scalingFactor = 1 + (scaledDemand / 100);
			return Math.round(baseValue * scalingFactor * percent);
		}

		/** Create a div containing actions specific to arcologies that are under the player's control
		 * @param {number} arcID
		 * @returns {Element}
		 */
		function controlActions(arcID) {
			const container = document.createElement("div");
			const agent = App.currentAgent(arcID);
			const him = agent ? getPronouns(agent).him : "them";
			container.append(document.createElement("br"));
			if (V.arcologies[arcID].government === "your trustees") {
				container.append(App.UI.DOM.passageLink("Appoint an agent", "Agent Select"));
			} else {
				let linkText = `Recall and reenslave ${him}`;
				const residentList = [agent.ID];
				const agentPartner = V.slaves.find((s) => s.assignment === Job.AGENTPARTNER && s.relationshipTarget === agent.ID);
				if (agentPartner) {
					linkText = `Recall them and reenslave your agent`;
					residentList.push(agentPartner.ID);
				}
				container.append(App.UI.SlaveList.render(residentList, [], App.UI.SlaveList.SlaveInteract.stdInteract));
				container.append(App.UI.DOM.link(linkText, () => {
					removeJob(agent, "be your agent");
					arcChanged(arcID);
				}));
			}
			container.append(" | ");
			const rename = App.UI.DOM.appendNewElement("span", container, '');
			rename.id = "rename";
			rename.append(App.UI.DOM.link(`Instruct ${him} to rename the arcology`, () => $("#rename").replaceWith([
				App.UI.DOM.makeTextBox(V.arcologies[arcID].name, (s) => {
					V.arcologies[arcID].name = s;
				}, false),
				App.UI.DOM.link("Confirm name", arcChanged, [arcID])
			])));

			if (V.arcologies[arcID].government === "your agent") {
				const {His, his, he, himself /* him is already set */} = getPronouns(agent);
				let r = [];
				r.push(`${His} ${agent.intelligence > 95 ? `brilliance` : `intelligence`} and education are the most important qualities for ${him}.`);
				if (agent.actualAge > 35) {
					r.push(`As with the Head Girl position, ${his} age and experience lend ${him} leadership weight.`);
				}
				if (agent.career === "an arcology owner") {
					r.push(`${His} career as an arcology owner ${himself} is, obviously, useful to ${him}.`);
				} else if (App.Data.Careers.Leader.HG.includes(agent.career)) {
					r.push(`${His} career in leadership helps ${him}.`);
				}
				if (agent.fetishStrength > 95) {
					if ((agent.fetish === "dom") || (agent.fetish === "sadist")) {
						r.push(`${His} sexually dominant fetish helps ${him} fill a leadership role.`);
					} else if ((agent.fetish === Fetish.SUBMISSIVE) || (agent.fetish === "masochist")) {
						r.push(`Unfortunately, ${he} has an inappropriate fetish for a leader.`);
					} else {
						r.push(`${His} sexual fetishes will influence how ${he} leads the arcology.`);
					}
				}
				if (agent.energy > 95) {
					r.push(`Finally, ${his} sexual depravity lets ${him} fit into arcology society naturally.`);
				}
				App.UI.DOM.appendNewElement("div", container, r.join(' '));
			}

			container.append(document.createElement("br"));
			const forceAbandonment = (fs) => {
				V.arcologies[arcID][fs] = null;
				arcChanged(arcID);
			};
			for (const fs of FutureSocieties.activeFSes(V.arcologies[arcID])) {
				App.UI.DOM.appendNewElement("div", container, App.UI.DOM.link(`Force abandonment of ${FutureSocieties.displayName(fs)}`, forceAbandonment, [fs]));
			}

			return container;
		}

		/** Create an element containing all the society-dependent stuff you can buy from this arcology.
		 * @param {number} arcID
		 * @returns {Element}
		 */
		function fsGoods(arcID) {
			const container = document.createElement("div");
			const arcology = V.arcologies[arcID];
			let r = [];
			r.push(`If ${arcology.name} has developed enough to begin exporting worthwhile goods, it may be of interest to acquire some.`);
			const opinionDiscount = App.Neighbor.opinion(arcology, V.arcologies[0]) * 10;
			const basePrice = Math.trunc((7500 - opinionDiscount) * V.upgradeMultiplierTrade);
			const controlled = (arcology.government === "your trustees") || (arcology.government === "your agent");
			if (controlled) {
				r.push(`Since it is under your control, it is no problem at all to request the transfer of goods to ${V.arcologies[0].name}.`);
			} else if (V.PC.skill.hacking >= 50) {
				r.push(`It is within your skills to redirect an outgoing shipment to ${V.arcologies[0].name} for your retrieval.`);
			} else if (arcology.direction === V.arcologies[0].embargoTarget) {
				r.push(`However, due to your active embargo, trade with ${arcology.name} is not possible.`);
			}
			App.UI.DOM.appendNewElement("p", container, r.join(' '));

			let exports = 0;

			/** Build a link or text block describing how to acquire a specific good from this arcology
			 * @param {string} fsRequired - the FS that the arcology has to have for this block to appear
			 * @param {string} itemName - the item name to check to see if the player already has this item
			 * @param {string} category - the category to check to see if the player already has this item
			 * @param {string} itemDisplay - a display name for a group of the item; as in, "a shipment of XXX" or "enough XXX"
			 * @param {function(): void} property - adjusts the global property controlling whether this item has been acquired
			 * @param {number} [itemPrice] - the price the player should pay for the item; by default, basePrice (computed above)
			 */
			function addAcquisitionBlock(fsRequired, itemName, category, itemDisplay, property, itemPrice = basePrice) {
				if (arcology[fsRequired] > 95) {
					if (!isItemAccessible.entry(itemName, category)) {
						if (controlled) {
							const link = App.UI.DOM.link(`Request a shipment of ${itemDisplay}`, () => {
								property();
								replaceDetails(arcID);
							});
							App.UI.DOM.appendNewElement("div", container, link);
						} else if (V.PC.skill.hacking >= 50) {
							const link = App.UI.DOM.link(`Divert an outgoing shipment of ${itemDisplay}`, () => {
								property();
								replaceDetails(arcID);
							});
							App.UI.DOM.appendNewElement("div", container, link);
						} else if (arcology.direction !== V.arcologies[0].embargoTarget) {
							const link = App.UI.DOM.link(`Divert an outgoing shipment of ${itemDisplay}`, () => {
								property();
								cashX(forceNeg(itemPrice), "capEx");
								replaceDetails(arcID);
							});
							const div = App.UI.DOM.appendNewElement("div", container, link);
							App.UI.DOM.appendNewElement("span", div, `Will cost ${cashFormat(itemPrice)}`, ["detail"]);
						}
					} else {
						App.UI.DOM.appendNewElement("div", container, `You already have enough ${itemDisplay}.`);
					}
					exports = 1;
				}
			}

			addAcquisitionBlock("FSRomanRevivalist", "a toga", "clothes", "togas", () => { V.boughtItem.clothing.toga = 1; });
			addAcquisitionBlock("FSEdoRevivalist", "a kimono", "clothes", "kimonos", () => { V.boughtItem.clothing.kimono = 1; });
			addAcquisitionBlock("FSArabianRevivalist", "harem gauze", "clothes", "silken harem garb", () => { V.boughtItem.clothing.harem = 1; });
			addAcquisitionBlock("FSAztecRevivalist", "a huipil", "clothes", "huipils", () => { V.boughtItem.clothing.huipil = 1; });
			addAcquisitionBlock("FSChineseRevivalist", "a slutty qipao", "clothes", "skimpy qipaos", () => { V.boughtItem.clothing.qipao = 1; });
			addAcquisitionBlock("FSEgyptianRevivalist", "ancient Egyptian", "collar", "Egyptian necklace replicas", () => { V.boughtItem.clothing.egypt = 1; });
			addAcquisitionBlock("FSPaternalist", "conservative clothing", "clothes", "conservative clothing", () => { V.boughtItem.clothing.conservative = 1; });
			addAcquisitionBlock("FSDegradationist", "chains", "clothes", "binding chains", () => { V.boughtItem.clothing.chains = 1; });
			addAcquisitionBlock("FSGenderFundamentalist", "a bunny outfit", "clothes", "bunny suits", () => { V.boughtItem.clothing.bunny = 1; });
			addAcquisitionBlock("FSIntellectualDependency", "a bimbo outfit", "clothes", "bimbo attire", () => { V.boughtItem.clothing.bimbo = 1; });
			addAcquisitionBlock("FSSlaveProfessionalism", "a courtesan dress", "clothes", "courtesan dresses", () => { V.boughtItem.clothing.courtesan = 1; });
			// addAcquisitionBlock("FSPetiteAdmiration", "petite dress", "clothes", "petite-sized dresses", () => { V.boughtItem.clothing.petite = 1; });
			addAcquisitionBlock("FSPhysicalIdealist", "body oil", "clothes", "body oil", () => { V.boughtItem.clothing.oil = 1; });
			addAcquisitionBlock("FSHedonisticDecadence", "stretch pants and a crop-top", "clothes", "stretch pants and crop-tops", () => { V.boughtItem.clothing.lazyClothes = 1; });
			addAcquisitionBlock("FSChattelReligionist", "a chattel habit", "clothes", "chattel religionist habits", () => { V.boughtItem.clothing.habit = 1; });
			addAcquisitionBlock("FSPastoralist", "Western clothing", "clothes", "Western clothing", () => { V.boughtItem.clothing.western = 1; });
			addAcquisitionBlock("FSRepopulationFocus", "a maternity dress", "clothes", "maternity dresses", () => { V.boughtItem.clothing.maternityDress = 1; });
			addAcquisitionBlock("FSRepopulationFocus", "attractive lingerie for a pregnant woman", "clothes", "maternity lingerie", () => { V.boughtItem.clothing.maternityLingerie = 1; });
			addAcquisitionBlock("FSRepopulationFocus", "a small empathy belly", "bellyAccessory", "empathy bellies", () => { V.boughtItem.clothing.belly = 1; });
			addAcquisitionBlock("FSStatuesqueGlorification", "platform heels", "shoes", "platform shoes", () => { V.boughtItem.shoes.heels = 1; });

			if (exports !== 1) {
				const luck = (arcology.direction === V.arcologies[0].embargoTarget) ? `Fortunately` : `Unfortunately`;
				App.UI.DOM.appendNewElement("p", container, `${luck}, they have nothing of value.`);
			}

			return container;
		}
	})();

	node.append(interact());

	return node;
};


code:
App.UI.SlaveInteract.agentAssignmentScene = function() {
	const node = new DocumentFragment();
	const slave = getSlave(V.AS);
	let r = [];
	assignJob(slave, "be your agent");

	if (slave.rivalry > 0) {
		const rival = getSlave(slave.rivalryTarget);
		if (rival) {
			rival.rivalry = 0;
			rival.rivalryTarget = 0;
		} else {
			r.push(`<span class="red">Error, rival not found.</span>`);
		}
		slave.rivalry = 0;
		slave.rivalryTarget = 0;
	}

	if (slave.relationship.isBetween(0, 4)) {
		const relation = getSlave(slave.relationshipTarget);
		if (relation) {
			relation.relationship = 0;
			relation.relationshipTarget = 0;
		} else {
			r.push(`<span class="red">Error, relationshipTarget not found.</span>`);
		}
		slave.relationship = 0;
		slave.relationshipTarget = 0;
	}

	const {
		He,
		he, his, him, woman
	} = getPronouns(slave);
	const {title: Master} = getEnunciation(slave);

	App.Events.drawEventArt(node, slave);

	r.push(`You order ${slave.slaveName} to come into your office for orders. The devoted ${SlaveTitle(slave)} has no prior warning that this is anything unusual, and from the`);
	if (slave.energy > 95) {
		r.push(`horny glint`);
	} else {
		r.push(`glow of sexual availability`);
	}
	r.push(`in ${his} ${App.Desc.eyesColor(slave)} as ${he}`);
	if (canWalk(slave)) {
		r.push(`enters,`);
	} else {
		r.push(`is helped in,`);
	}
	r.push(he);
	if (slave.energy > 95) {
		r.push(`seems to be hoping`);
	} else {
		r.push(`wouldn't mind hearing`);
	}
	r.push(`that you've called ${him} in for a quick fuck. In fact, the matter at hand is about as far as it could possibly be from that, on the spectrum of interactions between ${properMaster()} and slave.`);

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

	App.Events.addParagraph(node, [`You offer ${him}, without preamble, agency on your behalf in ${App.activeArcology().name}. As a ${woman} of intelligence, ${he} knows the basics of such an arrangement, but ${he}'s stunned into silence by the offer, so you outline it briefly. Having a slave lead an arcology would be too much, even for the most open minded of Free Cities societies. So, ${he} would be freed, albeit subject to a set of private, restrictive contracts that would allow you to recall ${him} if you wish, and require ${him} to follow your directions, if you give ${him} any. But other than that, ${he} would be the effective leader of an entire arcology. It's an unusual arrangement, but one that's becoming more common as multiple arcologies come under united control.`]);

	r.push(`${He}'s intelligent and confident of ${his} place within society as a valued slave, and knows that with your resources behind ${him}, this is likely something ${he}'s capable of succeeding at. Nevertheless, ${his} feelings are obviously mixed. It will be a challenge,`);
	switch (slave.fetish) {
		case "submissive":
			r.push(`especially for a sexual submissive like ${him}.`);
			break;
		case "cumslut":
			r.push(`and ${he}'ll have to find dominant ways to sate ${his} oral appetites.`);
			break;
		case "humiliation":
			r.push(`especially for a humiliation addict like ${him}.`);
			break;
		case "buttslut":
			r.push(`though ${he}'ll probably be able to live ${his} anal life vicariously by buttfucking others.`);
			break;
		case "boobs":
			r.push(`but ${he}'ll have a practically infinite procession of breasts to judge and fondle.`);
			break;
		case "pregnancy":
			r.push(`but the potential for impregnation of hundreds of slaves excites ${him}.`);
			break;
		case "dom":
			r.push(`but the prospect of having more slaves at ${his} whim than even ${he} could possibly use is incredibly exciting to ${him}.`);
			break;
		case "sadist":
			r.push(`but the prospect of having more slaves at ${his} whim than even ${he} could possibly break is incredibly exciting to ${him}.`);
			break;
		case "masochist":
			r.push(`especially for a masochist like ${him}.`);
			break;
		default:
			r.push(`though one ${he}'s willing to take on.`);
	}
	r.push(`It will mean that ${he}'ll see much less of you, something such a devoted slave may struggle with. Oppressed by the confusion and strength of ${his} feelings, ${he} begins to cry.`);
	App.Events.addParagraph(node, r);

	App.Events.addParagraph(node, [
		Spoken(slave, `"Thank you, ${Master},"`),
		`${he} gasps out. "I'll do my best."`
	]);

	return node;
};

repo_name: Arkerthan/fc

license: mit


code:
/** Reassign your agent's lover to the arcology run by your agent
 * @param {App.Entity.SlaveState} lover
 * @returns {DocumentFragment}
 */
App.UI.SlaveInteract.agentCompany = function(lover) {
	const frag = document.createDocumentFragment();

	const agent = getSlave(lover.relationshipTarget);
	const neighborArcology = V.arcologies.find((a) => agent.ID === a.leaderID);
	const {he, him, his, himself} = getPronouns(lover);
	const {He2, His2, he2, him2, his2, wife2} = getPronouns(agent).appendSuffix('2');
	const {say} = getEnunciation(lover);
	const {say: say2} = getEnunciation(agent);

	// make the assignment
	assignJob(lover, Job.AGENTPARTNER);

	// clear rivalry if applicable
	const rival = getSlave(lover.rivalryTarget);
	if (rival) {
		rival.rivalry = 0;
		rival.rivalryTarget = 0;
	}
	lover.rivalry = 0;
	lover.rivalryTarget = 0;

	// output text
	let r = [];
	r.push(`Working in ${neighborArcology.name}'s penthouse office, ${agent.slaveName} gets a video call from you. Naturally, ${his2} personal assistant program has been instructed to give these the highest priority, and your face appears in front of ${him2} immediately. ${He2} greets you properly, and asks you what ${he2} can do to serve you. You tell ${him2} you're planning to send one of your slaves over to ${his2} arcology to assist ${him2}. Exchanges of this kind are neither unusual nor particularly interesting, so a slight look of perplexity clouds ${agent.slaveName}'s face as ${he2} wonders why this merits a personal call. Normally, ${S.HeadGirl ? S.HeadGirl.slaveName : V.assistant.name} would handle it with ${him2} directly.`);
	App.Events.addParagraph(frag, r);

	r = [];
	r.push(`${His2} question is answered when you bring ${contextualIntro(agent, lover)} in close, putting ${him} in ${agent.slaveName}'s view. ${agent.slaveName}'s ${App.Desc.eyesColor(agent)} fly open with pleased surprise, but before ${he2} can speak, ${lover.slaveName} goes first.`);

	if (!canTalk(lover)) {
		r.push(`Unable to speak ${himself}, ${he} simply makes a heart shape with ${his} ${hasBothArms(lover) ? "hands" : "hand"} in view of the video call, and blows ${his} ${lover.relationship === 4 ? "lover" : wife2} a kiss.`);
	} else {
		r.push(Spoken(lover, `"Hi ${lover.relationship === 4 ? 'lover' : 'sweetheart'},"`));
		r.push(`${he} ${say}s in a syrupy tone.`);
		r.push(Spoken(lover, `"Miss me?"`));
	}
	App.Events.addParagraph(frag, r);

	r = [];
	r.push(`${agent.slaveName} smiles back at ${him}, glowing with pleasure, and responds with exaggerated arousal.`);
	switch (agent.fetish) {
		case "submissive":
			r.push(Spoken(agent, `"Looking forward to sleeping ${hasBothArms(agent) ? "in your arms" : "with you"}, babe,"`), `the submissive`);
			break;
		case "cumslut":
			r.push(Spoken(agent, `"Can't wait to kiss you, babe,"`), `the orally fixated`);
			break;
		case "humiliation":
			r.push(Spoken(agent, `"Can't wait to take you right in the middle of the plaza here,"`), `the exhibitionist`);
			break;
		case "buttslut":
			r.push(Spoken(agent, `"I can't wait to fuck you in your hot little ass,"`), `the anally fixated`);
			break;
		case "boobs":
			r.push(Spoken(agent, `"Looking forward to feeling your breasts again,"`), `the boob-loving`);
			break;
		case "pregnancy":
			r.push(Spoken(agent, `"Can't wait to share all the pregnant girls here with you,"`), `the impregnation fetishist`);
			break;
		case "dom":
			r.push(Spoken(agent, `"Looking forward to shoving you facedown, bitch,"`), `the dominant`);
			break;
		case "sadist":
			r.push(Spoken(agent, `"Looking forward to making you bite the pillow again, bitch,"`), `the sadistic`);
			break;
		case "masochist":
			r.push(Spoken(agent, `"Can't wait to feel you hurt me again, babe,"`), `the masochistic`);
			break;
		default:
			r.push(Spoken(agent, `"Babe, I can't wait to ${hasAnyArms(agent) ? "give you a hug and" : ""} tell you about ${neighborArcology.name},"`), `the loving`);
	}
	r.push(`leader of an entire arcology ${say2}s.`);
	App.Events.addParagraph(frag, r);

	return frag;
};


code:
App.Data.Facilities.arcologyAgent = {
	baseName: "arcology",
	genericName: null,
	jobs: {
		agentsSlave: {
			position: "agent's toy",
			assignment: Job.AGENTPARTNER,
			publicSexUse: true,
			fuckdollAccepted: false
		}
	},
	defaultJob: "agentsSlave",
	manager: {
		position: "agent",
		assignment: Job.AGENT,
		careers: ["an arcology owner"],
		skill: "headGirl",
		publicSexUse: true,
		fuckdollAccepted: false,
		broodmotherAccepted: false,
		shouldWalk: true,
		shouldHold: true,
		shouldSee: true,
		shouldHear: true,
		shouldTalk: true,
		shouldThink: true,
		requiredDevotion: 21
	},
	decorated: false
};

App.Entity.Facilities.AgentJob = class extends App.Entity.Facilities.ManagingJob {
	/**
	 * @param {App.Entity.SlaveState} slave
	 * @returns {string[]}
	 */
	checkRequirements(slave) {
		let r = super.checkRequirements(slave);
		if (slave.intelligence + slave.intelligenceImplant <= 15) {
			r.push(`${slave.slaveName} is not intelligent enough to be your agent.`);
		}
		return r;
	}
};

App.Entity.facilities.arcologyAgent = new App.Entity.Facilities.Facility(
	App.Data.Facilities.arcologyAgent,
	{
		// agent's partner, eventually
	},
	new App.Entity.Facilities.AgentJob()
);


code:
/**
 * @param {App.Entity.SlaveState} slave
 * @returns {string}
 */
App.Desc.bodyguard = function(slave) {
	const r = [];
	const {
		his, He, he
	} = getPronouns(slave);
	if (slave.fuckdoll !== 0 || slave.ID !== V.BodyguardID) {
		return "";
	}
	r.push(`${He} is your bodyguard.`);
	r.push(bgWeapon());

	if (slave.skill.combat > 30) {
		r.push(`${He} is <span class="skill">skilled at combat:</span> ${he} is comfortable with the use of modern firearms and edged weapons, and ${his} hands`);
		if (!hasBothArms(slave)) {
			r.push(`would be deadly weapons if ${he} had`);
			if (!hasAnyArms(slave)) {
				r.push(`any.`);
			} else {
				r.push(`more than one.`);
			}
		} else {
			if ((getArmCount(slave, 5) + getArmCount(slave, 6) > 1)) {
				r.push(`would be deadly weapons even if they weren't full of deadly weapons already.`);
			} else {
				r.push(`are deadly weapons.`);
			}
		}
	}

	return r.join(" ");

	function bgWeapon() {
		const w = [];
		const arcInfo = new App.Utils.Arcology(V.arcologies[0]);
		if ((slave.muscles + slave.height - 100) / 25 > 5) {
			w.push(`${He} has a long ceramic`);
			switch (arcInfo.revivalSociety()) {
				case RevivalSociety.ROMAN: w.push('spatha'); break;
				case RevivalSociety.NEO_IMPERIAL: w.push(`claymore`); break;
				case RevivalSociety.EGYPTIAN: w.push(`shotel`); break;
				case RevivalSociety.EDO: w.push(`odachi`); break;
				case RevivalSociety.ARABIAN: w.push(`kilij`); break;
				case RevivalSociety.CHINESE: w.push(`changdao`); break;
				case RevivalSociety.AZTEC: w.push(`macuahuitl`); break;
				case RevivalSociety.ANTEBELLUM: w.push(`saber`); break;
				case null: w.push(``); break;
			}
			w.push(`sword strapped to ${his} back,`);
			switch (slave.nationality) {
				case "American":
					w.push(`and, in keeping with ${his} heritage, a US Ordnance Mk43 Mod.1 GPMG`);
					break;
				case "Armenian":
				case "Belarusian":
				case "Cuban":
				case "Hungarian":
				case "Kazakh":
				case "Uzbek":
					w.push(`and, in keeping with ${his} heritage, a PKM GPMG`);
					break;
				case "Australian":
					w.push(`and, in keeping with ${his} heritage, a Lithgow F89 Maximi GPMG`);
					break;
				case "Austrian":
					w.push(`and, in keeping with ${his} heritage, a Steyr MG 74 GPMG`);
					break;
				case "Belgian":
					w.push(`and, in keeping with ${his} heritage, a FN Minimi M3 LMG`);
					break;
				case "British":
				case "Scottish":
					w.push(`and, in keeping with ${his} heritage, an L7A2 GPMG`);
					break;
				case "Canadian":
					w.push(`and, in keeping with ${his} heritage, a Colt Canada 5.56-LSW LMG`);
					break;
				case "Chilean":
				case "German":
					w.push(`and, in keeping with ${his} heritage, a Rheinmetall MG3 GPMG`);
					break;
				case "Chinese":
					w.push(`and, in keeping with ${his} heritage, a Norinco QJY-88 LMG`);
					break;
				case "Czech":
				case "Slovak":
					w.push(`and, in keeping with ${his} heritage, a ZVI Uk vz.59 Rachot GPMG`);
					break;
				case "Filipina":
					w.push(`and, in keeping with ${his} heritage, a Government Arsenal M60E4 GPMG`);
					break;
				case "Finnish":
					w.push(`and, in keeping with ${his} heritage, a Valmet KvKK 62 LMG`);
					break;
				case "French":
					w.push(`and, in keeping with ${his} heritage, a MAS AAT-F1 GPMG`);
					break;
				case "Indian":
					w.push(`and, in keeping with ${his} heritage, an OFB MG 2A1 GPMG`);
					break;
				case "Indonesian":
					w.push(`and, in keeping with ${his} heritage, a Pindad SM2 LMG`);
					break;
				case "Iranian":
					w.push(`and, in keeping with ${his} heritage, a DIO MGA3 GPMG`);
					break;
				case "Israeli":
					w.push(`and, in keeping with ${his} heritage, an IWI Negev NG7 GPMG`);
					break;
				case "Japanese":
					w.push(`and, in keeping with ${his} heritage, a Sumitomo Type 62 GPMG`);
					break;
				case "Korean":
					w.push(`and, in keeping with ${his} heritage, a S&T K12 GPMG`);
					break;
				case "Mexican":
					w.push(`and, in keeping with ${his} heritage, a SEDENA MG-21 GPMG`);
					break;
				case "Polish":
					w.push(`and, in keeping with ${his} heritage, a ZMT UKM-2000 GPMG`);
					break;
				case "Romanian":
					w.push(`and, in keeping with ${his} heritage, a FACSA PM md.93 LMG`);
					break;
				case "Russian":
					w.push(`and, in keeping with ${his} heritage, a PKP Pecheneg GPMG`);
					break;
				case "Serbian":
					w.push(`and, in keeping with ${his} heritage, a Zastava M09 LMG`);
					break;
				case "South African":
					w.push(`and, in keeping with ${his} heritage, a Vektor SS-77 GPMG`);
					break;
				case "Spanish":
					w.push(`and, in keeping with ${his} heritage, a CETME MG 82 Ameli LMG`);
					break;
				case "Swiss":
					w.push(`and, in keeping with ${his} heritage, a W+F-Bern MG51 GPMG`);
					break;
				case "Turkish":
					w.push(`and, in keeping with ${his} heritage, a MKEK MG3 GPMG`);
					break;
				case "Ukrainian":
					w.push(`and, in keeping with ${his} heritage, a Fort-401 LMG`);
					break;
				case "Vietnamese":
					w.push(`and, in keeping with ${his} heritage, a Z111 RPK LMG`);
					break;
				case "Zimbabwean":
					if (slave.race === "white") {
						w.push(`and, in keeping with ${his} heritage, a FN MAG-58 GPMG`);
					} else {
						w.push(`and a FN MAG 60.20 GPMG`);
					}
					break;
				default:
					w.push(`and a FN MAG 60.20 GPMG`);
			}
			w.push(`slung crosswise on ${his} chest.`);
		} else if ((slave.muscles + slave.height - 100) / 25 > 4) {
			w.push(`${He} has a ceramic`);
			switch (arcInfo.revivalSociety()) {
				case RevivalSociety.ROMAN: w.push('gladius'); break;
				case RevivalSociety.NEO_IMPERIAL: w.push(`kightly`); break;
				case RevivalSociety.EGYPTIAN: w.push(`khopesh`); break;
				case RevivalSociety.EDO: w.push(`katana`); break;
				case RevivalSociety.ARABIAN: w.push(`shamshir`); break;
				case RevivalSociety.CHINESE: w.push(`jian`); break;
				case RevivalSociety.AZTEC: w.push(`macuahuitl`); break;
				case RevivalSociety.ANTEBELLUM: w.push(`saber`); break;
				case null: w.push(``); break;
			}
			w.push(`sword strapped to ${his} back`);
			switch (slave.nationality) {
				case "American":
					w.push(`and, in keeping with ${his} heritage, a Colt M16A4 assault rifle`);
					break;
				case "Argentinian":
					w.push(`and, in keeping with ${his} heritage, a FMAP FARA-83 assault rifle`);
					break;
				case "Armenian":
				case "Belarusian":
				case "Kazakh":
				case "Uzbek":
					w.push(`and, in keeping with ${his} heritage, a Kalashnikov AK-74M assault rifle`);
					break;
				case "Australian":
					w.push(`and, in keeping with ${his} heritage, a Lithgow EF88 Austeyr bullpup assault rifle`);
					break;
				case "Austrian":
					w.push(`and, in keeping with ${his} heritage, a Steyr AUG A3 bullpup assault rifle`);
					break;
				case "Belgian":
					w.push(`and, in keeping with ${his} heritage, a FN FNC M2 assault rifle`);
					break;
				case "Brazilian":
					w.push(`and, in keeping with ${his} heritage, an IMBEL IA2 assault rifle`);
					break;
				case "British":
				case "Scottish":
					w.push(`and, in keeping with ${his} heritage, an L85A3 bullpup assault rifle`);
					break;
				case "Canadian":
					w.push(`and, in keeping with ${his} heritage, a Colt Canada MRR assault rifle`);
					break;
				case "Chilean":
					w.push(`and, in keeping with ${his} heritage, a FAMAE ACE 22NC assault rifle`);
					break;
				case "Chinese":
					w.push(`and, in keeping with ${his} heritage, a Norinco QBZ-95-1 bullpup assault rifle`);
					break;
				case "Colombian":
					w.push(`and, in keeping with ${his} heritage, an Indumil ACE 22 assault rifle`);
					break;
				case "Croatian":
					w.push(`and, in keeping with ${his} heritage, an HS Produkt VHS-2 bullpup assault rifle`);
					break;
				case "Cuban":
					w.push(`and, in keeping with ${his} heritage, an AKM assault rifle`);
					break;
				case "Czech":
				case "Slovak":
					w.push(`and, in keeping with ${his} heritage, a CZUB CZ-806 BREN-2 assault rifle`);
					break;
				case "Filipina":
					w.push(`and, in keeping with ${his} heritage, an Elitool M653P carbine`);
					break;
				case "Finnish":
					w.push(`and, in keeping with ${his} heritage, a SAKO Rk 95 TP assault rifle`);
					break;
				case "French":
					w.push(`and, in keeping with ${his} heritage, a Nexter FAMAS G2 bullpup assault rifle`);
					break;
				case "German":
					w.push(`and, in keeping with ${his} heritage, a H&K G36A2 assault rifle`);
					break;
				case "Hungarian":
					w.push(`and, in keeping with ${his} heritage, a FEG AMD-65M assault rifle`);
					break;
				case "Indian":
					w.push(`and, in keeping with ${his} heritage, an OFB MCIWS assault rifle`);
					break;
				case "Indonesian":
					w.push(`and, in keeping with ${his} heritage, a Pindad SS2 assault rifle`);
					break;
				case "Iranian":
					w.push(`and, in keeping with ${his} heritage, a DIO KH-2002 Khaybar bullpup assault rifle`);
					break;
				case "Israeli":
					w.push(`and, in keeping with ${his} heritage, an IWI MTAR-21 bullpup assault rifle`);
					break;
				case "Italian":
					w.push(`and, in keeping with ${his} heritage, a Beretta ARX-160 assault rifle`);
					break;
				case "Japanese":
					w.push(`and, in keeping with ${his} heritage, a Howa Type 89 assault rifle`);
					break;
				case "Korean":
					w.push(`and, in keeping with ${his} heritage, a Daewoo K2C1 assault rifle`);
					break;
				case "Mexican":
					w.push(`and, in keeping with ${his} heritage, a DGIM FX-05 Xiuhcoatl assault rifle`);
					break;
				case "Peruvian":
					w.push(`and, in keeping with ${his} heritage, a SIMA FAD bullpup assault rifle`);
					break;
				case "Polish":
					w.push(`and, in keeping with ${his} heritage, a FB MSBS assault rifle`);
					break;
				case "Romanian":
					w.push(`and, in keeping with ${his} heritage, a ROMARM PA md.86 assault rifle`);
					break;
				case "Russian":
					w.push(`and, in keeping with ${his} heritage, an Izhmash AN-94 Abakan assault rifle`);
					break;
				case "Serbian":
					w.push(`and, in keeping with ${his} heritage, a Zastava M21A assault rifle`);
					break;
				case "South African":
					w.push(`and, in keeping with ${his} heritage, a Vektor R4 assault rifle`);
					break;
				case "Spanish":
					w.push(`and, in keeping with ${his} heritage, a CETME Model C battle rifle`);
					break;
				case "Swedish":
					w.push(`and, in keeping with ${his} heritage, a Bofors Ak-5C assault rifle`);
					break;
				case "Swiss":
					w.push(`and, in keeping with ${his} heritage, a SIG SG 550 assault rifle`);
					break;
				case "Thai":
					w.push(`and, in keeping with ${his} heritage, a MND Type 11 assault rifle`);
					break;
				case "Turkish":
					w.push(`and, in keeping with ${his} heritage, a MKEK MPT-76 assault rifle`);
					break;
				case "Ukrainian":
					w.push(`and, in keeping with ${his} heritage, a Fort-227 assault rifle`);
					break;
				case "Vietnamese":
					w.push(`and, in keeping with ${his} heritage, a Z111 AKM assault rifle`);
					break;
				case "Zimbabwean":
					if (slave.race === "white") {
						w.push(`and, in keeping with ${his} heritage, a FN FAL battle rifle`);
					} else {
						w.push(`and a FN F2000 bullpup assault rifle`);
					}
					break;
				default:
					w.push(`and a FN F2000 bullpup assault rifle`);
			}
			w.push(`slung across ${his} chest.`);
		} else if ((slave.muscles + slave.height - 100) / 25 > 3) {
			w.push(`${He} has a`);
			switch (arcInfo.revivalSociety()) {
				case RevivalSociety.ROMAN: w.push('curved ceramic falcata'); break;
				case RevivalSociety.NEO_IMPERIAL: w.push('straight ceramic estoc'); break;
				case RevivalSociety.EGYPTIAN: w.push('sickle-shaped'); break;
				case RevivalSociety.EDO: w.push('curved ceramic wakizashi'); break;
				case RevivalSociety.ARABIAN: w.push('curved ceramic yatagan'); break;
				case RevivalSociety.CHINESE: w.push('curved ceramic dao'); break;
				case RevivalSociety.AZTEC: w.push('straight ceramic macuahuitl'); break;
				case RevivalSociety.ANTEBELLUM: w.push('curved ceramic saber'); break;
				case null: w.push('straight ceramic'); break;
			}
			w.push(`sword strapped to ${his} back`);
			switch (slave.nationality) {
				case "American":
					w.push(`and, in keeping with ${his} heritage, a KRISS Vector SMG`);
					break;
				case "Argentinian":
					w.push(`and, in keeping with ${his} heritage, a Halcon ML-63 SMG`);
					break;
				case "Armenian":
				case "Belarusian":
				case "Kazakh":
				case "Uzbek":
					w.push(`and, in keeping with ${his} heritage, a Kalashnikov AKS-74U PDW`);
					break;
				case "Austrian":
					w.push(`and, in keeping with ${his} heritage, a Steyr AUG A3 Para XS bullpup SMG`);
					break;
				case "Belgian":
					w.push(`and, in keeping with ${his} heritage, a FN P90 bullpup PDW`);
					break;
				case "Brazilian":
					w.push(`and, in keeping with ${his} heritage, a Taurus MT40 G2 SMG`);
					break;
				case "British":
				case "Scottish":
					w.push(`and, in keeping with ${his} heritage, an L91A1 SMG`);
					break;
				case "Chilean":
					w.push(`and, in keeping with ${his} heritage, a FAMAE SAF-200 SMG`);
					break;
				case "Chinese":
					w.push(`and, in keeping with ${his} heritage, a Norinco QCQ-05 SMG`);
					break;
				case "Croatian":
					w.push(`and, in keeping with ${his} heritage, a PM Agram 2000 SMG`);
					break;
				case "Filipina":
					w.push(`and, in keeping with ${his} heritage, a Ferfrans SCW7 PDW`);
					break;
				case "German":
					w.push(`and, in keeping with ${his} heritage, an H&K MP7A1 PDW`);
					break;
				case "Indian":
					w.push(`and, in keeping with ${his} heritage, an OFB MSMC SMG`);
					break;
				case "Indonesian":
					w.push(`and, in keeping with ${his} heritage, a Pindad PM1A1 SMG`);
					break;
				case "Iranian":
					w.push(`and, in keeping with ${his} heritage, a DIO MPT-9 Tondar SMG`);
					break;
				case "Israeli":
					w.push(`and, in keeping with ${his} heritage, an IWI Uzi SMG`);
					break;
				case "Italian":
					w.push(`and, in keeping with ${his} heritage, a Beretta MX4 SMG`);
					break;
				case "Korean":
					w.push(`and, in keeping with ${his} heritage, a Daewoo K1A PDW`);
					break;
				case "Mexican":
					w.push(`and, in keeping with ${his} heritage, a Mendoza Cobra SMG`);
					break;
				case "Polish":
					w.push(`and, in keeping with ${his} heritage, a FB PM-06 Glauberyt SMG`);
					break;
				case "Romanian":
					w.push(`and, in keeping with ${his} heritage, a UM Cugir LP7 SMG`);
					break;
				case "Russian":
					w.push(`and, in keeping with ${his} heritage, a KBP PP-90M1 SMG`);
					break;
				case "Serbian":
					w.push(`and, in keeping with ${his} heritage, a Zastava Master FLG SMG`);
					break;
				case "South African":
					w.push(`and, in keeping with ${his} heritage, a Milkor BXP SMG`);
					break;
				case "Spanish":
					w.push(`and, in keeping with ${his} heritage, a Star Z84 SMG`);
					break;
				case "Swedish":
					w.push(`and, in keeping with ${his} heritage, a Carl Gustav m/45 SMG`);
					break;
				case "Swiss":
					w.push(`and, in keeping with ${his} heritage, a SIG MPX SMG`);
					break;
				case "Turkish":
					w.push(`and, in keeping with ${his} heritage, a Sarsilmaz SAR 109 SMG`);
					break;
				case "Ukrainian":
					w.push(`and, in keeping with ${his} heritage, a Fort-224 bullpup SMG`);
					break;
				case "Vietnamese":
					w.push(`and, in keeping with ${his} heritage, a Z111 K-50M LMG`);
					break;
				case "Zimbabwean":
					if (slave.race === "white") {
						w.push(`and, in keeping with ${his} heritage, a Sterling Mk.IV SMG`);
					} else {
						w.push(`and a H&K MP5 SMG`);
					}
					break;
				default:
					w.push(`and a H&K MP5 SMG`);
			}
			w.push(`slung across ${his} chest.`);
		} else {
			w.push(`${He} has a short ceramic`);
			switch (arcInfo.revivalSociety()) {
				case RevivalSociety.ROMAN: w.push('pugio'); break;
				case RevivalSociety.NEO_IMPERIAL: w.push('baselard'); break;
				case RevivalSociety.EGYPTIAN: w.push('acinaces'); break;
				case RevivalSociety.EDO: w.push('tanto'); break;
				case RevivalSociety.ARABIAN: w.push('jambiya'); break;
				case RevivalSociety.CHINESE: w.push('nandao'); break;
				case RevivalSociety.AZTEC: w.push('macuahuitl'); break;
				case RevivalSociety.ANTEBELLUM: w.push('Bowie knife'); break;
				case null: w.push(''); break;
			}
			w.push(`sword strapped to ${his} back`);
			switch (slave.nationality) {
				case "American":
					w.push(`and, in keeping with ${his} heritage, a MAC-10 machine pistol`);
					break;
				case "Armenian":
				case "Belarusian":
				case "Cuban":
				case "Kazakh":
				case "Ukrainian":
				case "Uzbek":
					w.push(`and, in keeping with ${his} heritage, a Molot Ordnance Stechkin APS machine pistol`);
					break;
				case "Austrian":
					w.push(`and, in keeping with ${his} heritage, a Steyr TMP machine pistol`);
					break;
				case "Belgian":
					w.push(`and, in keeping with ${his} heritage, a VBR-Belgium PDW machine pistol`);
					break;
				case "Chinese":
					w.push(`and, in keeping with ${his} heritage, a Chongqing Changfeng CF-05 machine pistol`);
					break;
				case "Czech":
				case "Slovak":
					w.push(`and, in keeping with ${his} heritage, a CZUB CZ 75 Automatic machine pistol`);
					break;
				case "German":
					w.push(`and, in keeping with ${his} heritage, a H&K VP70 machine pistol`);
					break;
				case "Hungarian":
					w.push(`and, in keeping with ${his} heritage, a FEG KGP-9 machine pistol`);
					break;
				case "Israeli":
					w.push(`and, in keeping with ${his} heritage, an IWI Uzi Pro machine pistol`);
					break;
				case "Italian":
					w.push(`and, in keeping with ${his} heritage, a Beretta 93R machine pistol`);
					break;
				case "Japanese":
					w.push(`and, in keeping with ${his} heritage, a Minebea PM-9 machine pistol`);
					break;
				case "Mexican":
					w.push(`and, in keeping with ${his} heritage, a Trejo Modelo 2 Especial machine pistol`);
					break;
				case "Peruvian":
					w.push(`and, in keeping with ${his} heritage, a SIMA MGP-87 machine pistol`);
					break;
				case "Polish":
					w.push(`and, in keeping with ${his} heritage, a WITU PMM machine pistol`);
					break;
				case "Romanian":
					w.push(`and, in keeping with ${his} heritage, a UMS Pistolul md.98 Dracula machine pistol`);
					break;
				case "Russian":
					w.push(`and, in keeping with ${his} heritage, a KBP OTs-33 Pernach machine pistol`);
					break;
				case "Swedish":
					w.push(`and, in keeping with ${his} heritage, a Saab Bofors Dynamics CBJ-MS machine pistol`);
					break;
				case "Swiss":
					w.push(`and, in keeping with ${his} heritage, a B+T MP9 machine pistol`);
					break;
				case "Turkish":
					w.push(`and, in keeping with ${his} heritage, a TiSAS Zigana F machine pistol`);
					break;
				default:
					w.push(`and a Glock 18 machine pistol`);
			}
			w.push(`at ${his} side.`);
		}

		return w.join(" ");
	}
};